1. A. Gregor and Cryptography
- Pmoda=Pmodb
- 2≤a<b≤P
를 만족하는 (a,b)쌍 하나를 출력하라는 문제입니다.
(2,P−1)는 크기 조건에 따라 항상 만족하는 해입니다.
2. B. Gregor and the Pawn Game
체스의 1행과 8행을 따온 상황에서 1행에는 상대 pawn들, 8행에는 우리 pawn들이 있다고 할 때,
퀸을 만들 수 있는(=1행에 도달 가능한) pawn의 개수를 찾는겁니다.
그냥 그리디하게 매칭시켜주면 풀립니다.
string을 통해 비교적 간단하게 구현할 수 있습니다.
<cpp />
void solution() {
cin >> n;
string x, y; cin >> x >> y;
x = " "+x+" ", y = " "+y+" ";
bool chk[n+2] = {0,};
int cnt = 0;
REP(i,1,n) {
if (y[i] == '1') {
if (chk[i-1] == false && x[i-1] == '1') chk[i-1] = true, ++cnt;
else if (x[i] == '0') chk[i] = true, ++cnt;
else if (chk[i+1] == false && x[i+1] == '1') chk[i+1] = true, ++cnt;
}
}
cout << cnt << '\n';
}
3. C. Web of Lies
우선, 쿼리간에 정보가 이월되지 않는다는 조건을 주의하세요. 그것 때문에 많이 고생했습니다.
자신보다 값이 큰 놈이 연결되어있으면 무조건 죽습니다.
따라서 outdegree만 관리하면 풀 수 있습니다.
방법만 안다면 구현은 쉽습니다.
4. D. Integers Have Friends
ai≡ai+1≡⋯≡aj (mod m)일 때 "친구 그룹"을 만족합니다.
최대 친구 그룹의 크기를 구하세요.
ai−ai+1≡ai+1−ai+2≡⋯≡aj−1−aj≡0 (mod m)을 만족하므로,
bk=ak−ak+1 (1≤k<n)이라 정의하면 m|gcdj−1k=i(bk)를 만족합니다.
따라서 m≥2라는 조건을 만족시키는 경우는 gcdj−1k=i(bk)≠1이라는 조건과 동치입니다.
따라서 구간 gcd가 1이 되지 않는 가장 긴 부분 배열 길이를 구하면 됩니다. 이는 sparse table(업데이트 쿼리가 없기 때문에) 또는 segment tree를 통해 관리할 수 있습니다.
가장 긴 부분 배열의 길이를 구하기 위해서는 two-pointers method를 사용하면 됩니다.
n=1인 경우를 따로 처리하지 않으면 WA 5가 뜹니다. 주의하세요.
<cpp />
void solution() {
int n; cin >> n;
SegmentTree<ll> gcdtree(n-1,0,[&](ll a, ll b) {return gcd(a,b);});
REP(i,1,n) cin >> a[i];
if (n == 1) {
cout << 1 << '\n';
return;
}
REP(i,1,n-1) gcdtree.update(i,abs(a[i]-a[i+1]));
int l = 1, r = 1, ans = 0;
while (r <= n-1) {
if (gcdtree.query(l,r) == 1) ++l;
else ans = max(ans,r-l+2), ++r;
}
cout << ans << '\n';
}
'PS 기록들' 카테고리의 다른 글
Codeforces Round #750 (Div. 2) (0) | 2021.10.26 |
---|---|
Codeforces Round #713 (Div.3) (0) | 2021.08.06 |
제 3회 류호석배 알고리즘 코딩 테스트 (0) | 2021.07.21 |
7월 PS 일지 (0) | 2021.07.19 |
6월 PS 일지 (0) | 2021.06.05 |