Processing math: 100%
알고리즘 블로그
article thumbnail
Published 2021. 8. 2. 15:15
Codeforces Round 736 (Div.2) PS 기록들

1. A. Gregor and Cryptography

  • Pmoda=Pmodb
  • 2a<bP

를 만족하는 (a,b)쌍 하나를 출력하라는 문제입니다.

(2,P1)는 크기 조건에 따라 항상 만족하는 해입니다.

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

aiai+1aj (mod m)일 때 "친구 그룹"을 만족합니다.

최대 친구 그룹의 크기를 구하세요.

aiai+1ai+1ai+2aj1aj0 (mod m)을 만족하므로,

bk=akak+1 (1k<n)이라 정의하면 m|gcdj1k=i(bk)를 만족합니다.

따라서 m2라는 조건을 만족시키는 경우는 gcdj1k=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
profile

알고리즘 블로그

@도훈.

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!