PS/Codeforces

Codeforces Round #762 (Div. 3)

dong_gas 2021. 12. 21. 02:32

오늘은 div3라 내심 기대하면서 응시했다. 아쉽게도 점수가 떨어졌다. C번을 너무 오래 붙잡고 있었다.

 

 

코포를 시작한 이후 처음으로 점수가 떨어졌다. 킹받는다. 보면 알겠지만 C번에 90분을 꼬라박았다. 민트는 다음 기회에....

 

 

A.

그냥 구간 반 나눠서 똑같으면 YES 다르면 NO를 출력하면 된다.

 

더보기
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;

string s;

void solve() {
	cin >> s;
	if (s.size() % 2 == 1) {
		cout << "NO" << endl;
		return;
	}
	bool yes = true;
	for (ll i = 0; i < s.size() / 2; i++) {
		if (s[i] != s[s.size() / 2 + i]) yes = false;
	}
	if (yes) cout << "YES" << endl;
	else cout << "NO" << endl;
}


int main() {
	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	int tc = 1; cin >> tc;
	while (tc--) {
		solve();
	}

	return 0;
}

 

 

 

B.

은근 오래 걸렸다.

(제곱수의 개수) + (세제곱수의 개수) - (제곱수이면서 세제곱수인 수의 개수)가 답인 것은 금방 알아차렸다. 

근데, 제곱수이면서 세제곱수인 수를 어떻게 셀 지 몰랐다. 후에 관찰을 통해 자연수의 여섯제곱수이면 어떤 수의 제곱수이면서 세제곱수인 것을 확인하였다. 여섯제곱수는 범위 내에 많지 않기 때문에 금방 셀 수 있었다.

 

더보기
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;

ll n;

void solve() {
	cin >> n;
	//cout << sqrt(n) << ' ' << cbrt(n) << endl;
	ll ans = (ll)sqrt(n) + (ll)cbrt(n);
	ll tmp = 1;
	ll cnt = 0;
	for (ll i = 1; i <= 100; i++) {
		if (i * i * i * i * i * i <= n) cnt++;
		else break;
	}
	ans -= cnt;
	cout << ans << endl;
}


int main() {
	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	int tc = 1; cin >> tc;
	while (tc--) {
		solve();
	}

	return 0;
}

 

 

 

C.

개빡치는 문제이다. 열심히 구현했다. 신경 쓸 것이 너무 많았다. 구현하고 예제도 잘 돌아가서 제출했는데, 런타임에러가 뜬다더라. 결론부터 말하면 stoi 때문이었다. int범위를 벗어나는 수가 있었기 때문...

 

난 당연히 풀이에 문제가 있는 줄 알아서 거의 1시간 가까이 풀이를 보면서 반례가 무엇이 있을까 고민했다. 엄청 오랜 시간 끝에 내가 만든 예제 1개가 오류를 내는 걸 확인했다. 근데도 왜 오류가 나는지 못 알아채서 결국 조건문을 이용해서 문자열을 열심히 출력했다. 그리곤 맞았다.

 

끝나고 동기가 알려줬는데, stoi 오버플로우 때문이더라. 아~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ stoi를 stoll로 바꾸니 맞더라. 에 혀. 그래도 앞으로 stoi 때문에 틀릴 일 없을 테니 이득이다. 아래는 stoll을 이용한 AC 코드이다.

 

더보기
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;

string a, b, s;

void solve() {
	cin >> a >> s;
	b = ""; //나중에 뒤집자.
	ll idx = s.size() - 1; //s의 인덱스

	for (ll i = a.size() - 1; i >= 0; i--) {
		if (idx < 0) {
			cout << -1 << endl;
			return;
		}

		if (a[i] > s[idx]) {
			if (idx < 1) {
				cout << -1 << endl;
				return;
			}
			if (s[idx - 1] == '1') {
				b+=(s[idx] - a[i] + 10 + '0');
			}
			else {
				cout << -1 << endl;
				return;
			}
			idx -= 2;
		}
		else {
			b+=(s[idx] - a[i] + '0');
			idx--;
		}

	}
	while (idx >= 0) {
		b += s[idx];
		idx--;
	}

	reverse(b.begin(), b.end());
	
	cout << stoi(b) << endl;
}


int main() {
	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	int tc = 1; cin >> tc;
	while (tc--) {
		solve();
	}

	return 0;
}

 

 

 

E.

C를 내고 15분 정도가 남았는데, D보다 E가 더 많이 풀려있길래 E를 보았다. 조금 읽다가 시간이 다 되었다. 이건 내일 업솔빙할 예정이다.

(12/24추가) 업솔빙 실패했다.ㅠ 결국 에디토리얼 보았는데, 스택을 이용하더라 어떻게 이런생각을! 신기하다.

 

 


드디어 내일 종강한다. 너무 피곤하다. 그치만 지금 분리수거를 하러 가야 한다 ㅂㄷㅂㄷ

 

1월 전에 민트 가고 싶다.