Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

lmlmlm

Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round) 본문

문제풀기

Codeforces Round #778 (Div. 1 + Div. 2, based on Technocup 2022 Final Round)

lml 2022. 4. 13. 22:04

https://codeforces.com/contest/1654

 

E에서의 문제 착각으로 인한 시간 소비 과다. (+ 정해 구현하고도 10회정도 TLE)

F에서 정해를 찾았지만 판단미스로 (알고보니 상당히 복잡한)별해를 구현하다가 시간 끝.

 

A. Maximum Cake Tastiness

 

딱봐도 임의의 i, j에 대하여 이 둘을 인접하게 하는 것이 무조건 가능하므로 답은 a[i] + a[j]의 최댓값이다.

 

B. Prefix Removals

 

딱봐도 largest prefix를 제거하는 것과 그냥 한 char을 제거하는 것과 답이 같다.pf) largest prefix를 제거하지 못하게 되는 순간은 char을 제거하지 못하는 순간과 완벽히 동일하다.

 

C. Alice and the Cake

 

모두가 그랬을 것이라고 생각하지만, [a1, a2, ..]를 이용하여 한 숫자를 만드는 과정을 처음에 고려하였다.-> [1, 1, 1, 1, 1, 1]의 예제를 통해 이게 매우 어려움을 깨닳았다.-> 이후 반대로 특정한 첫 숫자 A(= a1 + a2 +...)를 [a1, a2, ...]로 만드는 과정을 생각하였다.-> 큰 원소들부터 하나하나 만들어주면 AC

 

D. Potion Brewing Class

 

간선이 n - 1개라는 점에서 트리임을 바로 캐치하면 사실 풀이는 직관적으로 생각해낼 수 있다.

-> 모든 소수에 대해서 트리에서 dfs를 해주면 된다.

-> 하지만 위의 풀이상에서는 대략 1e4개의 소수에 대해서 1e5짜리 dfs를 하기에 TLE

-> 그래서 모든 소수가 아니라 꼭 필요한 소수들에 대해서만 계산을 진행해주면 된다.

 

E. Arithmetic Operations

 

TLE를 진심 10번 정도 받았다. 솔직히 N값을 5e4로 설정하더라도 이상한 풀이들이 뚫릴 것 같진 않다.

처음에는 1) a_i가 실수로 변할 수 있다고 생각함 2) a_i가 꼭 i번째 자리일 필요가 없다고 생각함 

 

n이 1e5라는 것은 그렇다 치고 a_i의 범위가 1e5라는 것에 착안 (이 최대치를 m이라 하자)

-> 풀이가 nlgm 혹은 mlgn일 수 있는가?

-> 1) 딱히 이분탐색으로는 안될 것 같음. 

    2) set, map을 이용하고 n번만 계산하는 것도 x

    3) 아주 엄청난 등차수열을 구해주는 기똥찬 자료구조가 존재? -> 어차피 못 만들듯함

-> 제곱 반절 나누기를 고려하였지만, d가 커졌을 때 처리할 방법을 생각해내지 못하였다.

 

-> a[i]의 크기가 1e5이하이기 때문에 반드시 d가 일정 이상의 값을 가지게 되면 더 확인할 필요가 없다는 점

https://codeforces.com/contest/1654/submission/150247329

 

F. Minimal String Xoration

 

이문제는 진짜로 보자마자 suffix array를 떠올렸는데 ㅜㅜ 왜 버렸을까

https://codeforces.com/contest/1654/submission/153551341

구현도 심지어 어렵지 않은...

 

버린 이유는 사실 분할 정복이 가능할거라고 생각했기 때문이다.

-> 관찰해보면 특정 수 x로 xoration을 한다고 가정했을 때 x가 n번 비트를 가지면 그 비트를 중심으로 뒤집힌다.

-> 그렇다면 (1 ~ slen / 2)의 최소와 (slen / 2 + 1 ~ slen)의 최소를 구해서 둘을 합쳐주면 되는 것 아닐까?

-> 문제점 1 : (1 ~ slen / 2)에서의 xoration과 (slen / 2 + 1 ~ slen)의 xoration이 같아야 한다.

-> 해결법 : pair로 어떤 수가 xoration되었는지 같이 기록해준다.

-> 문제점 2 : 근데 만약에 여려 x에 대해서 (1 ~ slen / 2) 값이 같은 최솟값을 준다면 어떻게 하는가

-> (1 ~ slen / 2)를 최소로 하는 여러 개의 x를 가져간다면 "aaaaaaaaaa" 따위에서 무조건 TLE 터진다.

Segtree나 DFS풀이가 있는 거로 보아 위의 풀이가 가능은 하겠지만 구현이 훨씬 좆같다

-> 개중에서 몇몇은 그냥 정해를 분할정복처럼 된 형태일 듯하네요 음...

'문제풀기' 카테고리의 다른 글

AtCoder Beginner Contest 248  (0) 2022.04.17
Codeforces Round #781 (Div. 2)  (0) 2022.04.15
Educational Codeforces Round 126  (0) 2022.04.11
Codeforces Round #780 (Div. 3)  (0) 2022.04.01
Codeforces Round #779 (Div. 2)  (0) 2022.03.30
Comments