JooDdae PS 블로그


  • 홈

  • 소개

  • 아카이브

  • 태그

  • 카테고리

  • 검색

Longest Path to WF 팀연습-2

작성일 2021-09-25 | In PS |

Longest Path to WF 팀연습 기록

2021/09/24 NEERC 2010

image

I : 시작하자마자 읽고 좀 고민하니 풀이가 나왔다. 코딩큐를 기다리며 구현 구체화를 했고 바로 AC. N에서 BFS를 돌려 1부터 시작했을 때 갈 수 있는 경로를 찾을 수 있고, 사전순으로 빠른 경로가 나오도록 갈 수 있는 경로중 가장 $c$가 작은 경로만을 선택하게 다시 1부터 시작하는 BFS를 돌리면 된다.

평소와는 다르게 문제를 읽는 담당이 되었었다. 나는 풀이가 잘 나오지 않았었고, 기하 문제 및 비교적 쉬운 문제들을 두분이서 모두 해결하셨다.

J : 정말 열심히 구현했다. 다행히(?) BC의 풀이가 금방 나오지 않아 코딩큐가 비어있어서 여유롭게 코딩했다. 체감상 2시간은 잡은거 같다.

Upsolved

A : 열심히 구현하면 된다. 누적합을 이용한다면 더 쉽게 구현할 수 있다.

2021/09/24 NEERC 2009

image

D : I를 열심히 고민하고 있었는데, 풀이가 잘 나오지 않아 솔브가 나온 문제를 잡게 되었다. 간단한 map 기본문제

F : edenooo님이 I 풀이가 나와서 또다시 솔브가 나온 문제를 잡게 되었다. 단어의 길이가 짧으면 짧을수록 좋으니깐 한글자 단어부터 우선순위 큐에 넣고 하나씩 빼는데, 만약 그 단어가 단어장에 없으면 정답에 추가하고 아니라면 스킵한 뒤에 그 단어의 뒤에 26가지의 알파벳을 더한 문자열을 다시 우선순위 큐에 넣는다. 정답의 개수가 $N$개 미만 일때까지 반복하기 때문에 우선순위 큐에서 뽑히게 되는 단어의 개수는 최대 $N+M$개이고, 이 개수에 $26$을 곱한 만큼 우선순위 큐에 다시 들어가므로 충분히 시간내에 돈다.

G : 또또 솔브가 그나마 나온 문제를 잡게 되었다. $(n-1)(m-1)$번의 이동을 시뮬레이션 하면 각 $i$가 어디로 이동하는지, 그리고 $i$가 더해지는 횟수를 구할 수 있다. 이를 모든 $i$에 대해 저장하고 스파스 테이블을 $10^{100}$이 돌어갈 만큼 전처리해 놓는다면 각 $i$마다 로그에 답을 찾을 수 있게 된다. 코포에서는 256MB로 $ 10^{100} < 2^{334}$인 점을 이용해 아슬아슬하게 메모리 제한을 통과할 수 있었지만, 백준은 128MB라서 $10^{100} < 4^{167}$으로 메모리를 절반으로 줄인채로 맞았다.

Upsolved

2021/09/24 NAIPC 2019

image

J : NM DP 를 세운뒤 경우의 수를 잘 세워주면 된다. 풀이가 금방 나왔는데 머리가 꼬여서 한번 갈아엎었다.

M : 이것저것 왔다갔다 하다가 솔브수가 나와서 잡았다. 구간을 절반씩 나눠가면서 경우의 수를 잘 세주면 된다. 나눠지는 두 구간에 속한 원소가 완전히 다른지, 아니면 두 구간의 원소가 순서까지 정확히 같은지 판별해야 하는데 각각을 서로 다른 수열과 쿼리 2, 해싱을 이용해 풀어 뇌절했다. 그냥 머지소트를 하는대로 나이브하게 구현해도 상한이 $O(N \log N)$임이 보장되기 때문에 코드도 짧게 나온다. 하지만 다시 구현하는 건 귀찮으므로 패스.

저번과 마찬가지로 문제를 읽는 담당이 되었다. 어려운 문제를 Aeren님이 다 푸셔서 성적은 잘 나왔는데 나는 거의 한게 없었다.. E번 풀이를 도와준 정도?

Upsolved

E : $2^M$의 모든 경우에 마지막 두개 $i,j$를 선택했을 때 가능한 $k$를 찾으면 된다. $i,j,k$쌍을 비교하기 위해 전처리로 $O(N^2M)$, DP를 전이하는 데 $O(N^3)$으로 총 시간복잡도 $O(2^M(N^3+N^2M))$으로 빡빡하게 돌아간다. 코드를 보면서 디버깅을 도왔기 때문에 거의 그대로 코딩했다.

2021/09/24 NAIPC 2017

image

J : 연산의 결과를 본다면 결국 같은 수의 하얀 돌과 검은 돌을 지울 수 있다. 즉, 마지막에 한개씩의 돌을 남기긴 위해서 입력으로 같은 수의 돌이 들어와야 한다. 같은 수의 돌이 있다면 3개의 돌을 선택해서 같은 색의 두 돌을 뺄 수 있어서 항상 가능함을 볼 수 있다.

그 뒤에 약 4시간동안 D를 잡았지만 계속 풀이가 터진채로 못 풀었다. 업솔빙 예정..

Upsolved

D : 문제를 다르게 보면 트리 위에서 LIS를 구하는 것으로 볼 수 있고, 이는 리프 노드부터 multiset을 이용해 관리한다면 small-to-large를 이용해 제한시간 내에 풀 수 있다.

중간에 5번의 팀연습이 추가로 있었지만 초반 몇번을 너무 못풀어서 블로그 글을 쓸 의욕이 나지 않았다. 다시 시작..

2021/10/12 NEERC 2015

image

L : 그냥 브루트포스 문제

B : image 이런 형태로 열심히 construct 하면 된다.

Upsolved

D : 재귀적으로 문제를 해결하면 된다. $N$이 짝수라면 $N/2$를 해결한 뒤 나온 수의 목록에 $2$를 곱해주면 되고, 홀수라면 $N$보다 작은 $3^{M}$을 찾아서 목록에 추가하고 $N-3^M$을 해결하면 된다. 홀수 다음에는 반드시 짝수가 오게 되므로 나중에 나올 수에는 추가로 앞의 수보다 $2$가 한번 더 곱해지고, 당연히 수는 줄어들어서 $3^M$보다는 작은 $3$의 제곱수가 곱해지면서 조건에 맞는 수열이 만들어진다.

E : - 가 있으면 나오는 숫자 다음에 + 를 추가하면 된다. leading zero 나 수가 한자리 일때 등을 잘 처리해줘야 한다.

G : 보통 구현하는 위상정렬에서 큐 대신 우선순위 큐를 사용한다면 사전 순 최소를 뽑아낼 수 있다. 우선순위 큐에서 원소를 뽑아낼 때 K 가 남아있다면 선택을 미룰 수 있다는 뜻이므로 K를 감소시킨 뒤, 다른 우선순위 큐에 저장해놓는다. $N$​개의 수를 뽑아내지 못했는데 우선순위 큐가 비어있다면, 다른 우선순위 큐에서 원소를 가져와서 진행시켜야 한다. 추가해야 하는 조건이 조금 더 있지만, 생략한다.

H : s[0] * 31 + s[1] == t[0] * 31 + t[1] 인 s, t를 찾은 뒤 두 문자열을 잘 배치해서 1000가지 종류를 만들면 된다.

J : $p_r$번 티켓으로 여행을 마칠 수 있다면 $p_{[r+1,n-1]}$티켓으로도 여행을 마칠 수 있다. 이분탐색으로 가장 작은 $r$을 찾고, $\min p_r..p_{n-1}$을 출력하면 된다. $r$이 가능한지 판별은 일차원 dp + 세그먼트 트리로 간단히 구할 수 있다.

K : 각도만 보기로 했을 때, i -> j, j -> i 가 가능한지 판별한 뒤 둘다 가능하다면 i->j가 가능한 것으로, 일차원 dp로 $O(N^2)$에 풀 수 있다.

대회중에 충분한 시간을 고민했었다고 생각한 D, K는 풀이를 까 봤는데, 정말 좋은 문제들이었다. 이런 좋은 문제의 풀이를 찾아내야 하는데… 대회 끝나고 보니 푼 문제가 없는거나 다름 없었다

더 읽어보기 »

Longest Path to WF 팀연습-1

작성일 2021-09-08 | In PS |

Longest Path to WF 팀연습 기록

2021/09/07 NWERC 2017

image

I : 증명을 하지 않은 그리디 + 냅색 디피를 제출했다가 틀렸고, 오타를 낸걸 고치느라 2번정도 더 틀렸다. edenooo님이 Exchange Arguement만을 쓴 뒤 그리디하게 답을 찾는 코드를 제출했다가 틀리셨고, 전에 제출했던 코드 안의 냅색 DP와 섞으니깐 맞았다. 패널티 망한 가장 큰 이유..

D : 그냥 쉬운 문제였지만, long long을 안써서 1 WA에 디버깅 약 10분을 낭비했다.

F : 보자마자 지루하지 않은 수열 문제가 떠올렸고, $O(NlogN)$ 풀이를 떠올리는데 시간이 걸리긴 했지만 풀이 그대로 한번에 맞았다.

Upsolved

J : 남은 문제들 중 그나마 사람들이 푼 문제여서 F번을 푼 2시간 40분 이후로 계속 잡았는데 끝날 때까지 아무것도 관찰하지 못했다. 풀이에 도움이 되지 않은 추측만 하면서 오히려 방해가 된거 같다. edenooo님 혼자서 브루트포스 코드를 가지고 관찰을 해서 맞는 풀이가 나왔지만, 제한시간 안에 풀지 못했다. 업솔빙은 했지만 왜 되는건지 모르겠다. 이게 다이아의 애드혹?

H : 식을 보니깐 $a^2$를 최대화 하도록 한 곳에 최대한 몰아주거나 $7*min(a,b,c)$를 최대화 하도록 골고루 나눠주는 두 방식이 가능성이 있어보였고, 그대로 짰더니 맞았다.

K : 강한 적을 최대한 나중에 만나도록 만든 다음에 답을 구하면 된다. 답을 구하는 과정에서 뇌절을 미친듯이 했다. 대회때 내가 잡았으면 패널티가 터졌을 가능성이 99%였다.

2021/09/08 NWERC 2018

image

I : 시작하자 마자 솔브가 나와서 차분히 읽어보니 쉬운 그리디 문제. 빠르게 AC

K : 문제를 읽었더니 얼마 전에 엄청 고통받으면서 푼 브론즈 문제였다는 걸 기억해냈지만 풀이가 떠오르지 않았고, 시작부터 차근차근히 풀어서 20분이나 걸렸다. 예전엔 한시간 이상 걸렸던 걸로 기억하는데 발전한건가?

J : 문제를 잘못읽고 1WA했지만 그렇게 크게 벗어나진 않았음을 깨닫고 풀이를 크게 바꾸지 않고 풀어냈다. 오타가 나서 1WA를 추가로 했었다.

J번을 풀었을 당시가 2시간 30분째였는데, 그 이후로 아무것도 팀에 도움이 되지 못했다.

Upsolved

E : 이런 문제를 잡았어야 했는데 풀이가 나올 당시 J번을 푸느라 바빴고, 다른 문제를 막 풀어서 시간이 비어있던 edenooo님이 풀었다. 조금의 함정이 있긴 했지만 예제로 알려줘서 큰 문제가 되지 않았다. 문제를 해결할 때 가장 어려운 점은 파싱+구현. edenooo님의 풀이가 예상외로 빠르게 통과한다는 이야기를 듣고 대충 짰더니 1 TLE. 그 뒤에 시간복잡도를 신경쓰며 짰더니 코너케이스를 하나 놓쳐서 1WA를 적립한 뒤에 맞았다.

H : 그냥 쉬운 그리디 문제. 영어 해석하는게 풀이 나오는 시간보다 오래 걸렸다.

2021/09/10 CERC 2015

image

C : L번을 풀만한 문제로 착각해서 풀이를 열심히 찾던 중에 쉬운 문제들을 모두 팀원 두분이서 해결했다. 남은 문제들 모두 골고루 적게 풀린 상태였고, 당시에 아무도 읽지 않았다는 C번을 읽었는데, 풀이가 나올거 같아서 잡았다. 스위핑을 떠올린 이후로는 풀이를 막힘없이 해냈던거 같았다. 2시간 30분쯤에 코드를 완성했지만 틀렸는데, 코딩 큐가 밀려있어서 약 1시간동안 열심히 손으로 반례를 찾아보았으나 찾아내지 못하고 스트레스를 짜서 찾아냈다. 풀이에는 결함이 없었는데, 코드 안에서 순서만 바꿔주니깐 맞는 거였다. 그래서 4시간 29분에 AC.

Aeren님이 4문제, edenooo님이 4문제, 그리고 내가 1문제를 풀어서 9솔이 되었다.

Upsolved

A : 문제를 열어보자마자 끄고 싶었다. 정말 풀기 싫었지만 결국엔 풀었다. 재미없는 구현문제

D : % m == 0인 곳을 칸막이로 둔다고 생각한다면 넣을지 뺄지를 자유롭게 결정할 수 있다. 그러므로 $2^{칸막이의 개수}$​가 정답이다.

K : 팀 연습때 들었던 edenooo님의 풀이를 그대로 구현해서 맞았다. indegree가 0인 애들은 반드시 subset에 넣어야 하고 subset내의 정점이 가르킨 정점은 제외한다. 그렇게 indegree가 0인 정점이 없을 때 까지 계속 정점을 지우다 보면 사이클이 남게 되는데, 짝수 길이의 사이클이기 때문에 남아있는 정점들 중에 한쪽에 있는 애들만 subset에 넣어주면 된다.

B : 팀 연습때 Aeren님이 $N \sqrt N$ 풀이가 나왔다고 해서 흥미가 떨어졌었는데, 다른 사람들의 코드 길이가 짧아서 궁금해서 풀이를 까봤다. $N/1 + N/2 + N/3 + … + N/N = O(N \log N)$ 이라는 점을 이용해서 $l$부터 $r$까지 이분탐색으로 답을 각각 구하면 $O(N \log^2 N)$으로 문제가 해결된다.

2021/09/13 Tsukuba 2017

image

I : policy-2의 경우 가장 많이 겹치는 순간을 찾으면 되고, policy-1의 경우 각 구간과 겹치는 구간의 개수 중 max 값에 1을 더한 값을 구하면 된다.

J : 입력 조건이 문제를 푸는데 필요한 단서였다. 입력 조건에 의해 각 문자가 복사될 수 있는 leftmost는 왼쪽으로 이동하기만 하면 되고, 쿼리로 들어온 위치 또한 leftmost를 구해 1번 힌트로 들어온 적이 있는지 확인하면 된다.

2021/09/14 NEERC 2016

image

H : 겹치는 구간은 합쳐주는 게 최적이므로 스위핑을 하면서 합쳐준다. <= 또는 >= 만 있는 입력이 들어오면 각각 L을 -32768로, R을 32767로 하면 구간으로 표현할 수 있다.

M : 들어오는 정점마다 가장 가까운 위치에 있는 먹이를 먹으러 가면 되는데, 만약 전에 사용했던 간선을 역으로 간다면 사용한 거리가 +1이 아니라 -1로 처리해야 한다.

Upsolved

D : edenooo님의 풀이를 들었는데, 어짜피 코딩 큐가 나한테 돌아오지 않을 예정이었어서 그냥 연습시간에 짰다. 우선 e[i]를 모두 더한 뒤에 s[i]를 s[i]-e[i]로 바꾼다면 S만 선택해서 답을 구하는 문제가 된다. 그 뒤에 MCMF으로 풀리도록 모델링을 잘 해주면 된다.

2021/09/15 NEERC 2012

image

점점 순위가 낮아지고 있는 거 같다..

H : 초반에 솔브가 꽤 나왔는데 Aeren님과 edenooo님이 각각 A와 G를 푸느라 내가 잡았다. 금방 풀이가 떠올라서 풀었는데 롱롱이슈 때문에 한번 틀렸다. 근데 백준에 보니깐 예전에 풀었던 문제였다. 그래서 쉽게 풀었나?

**E **: 마찬가지로 솔브가 많은 문제를 잡게 되었다. 1의 자리를 채울 수 있는 박스들 중 최대 값을 가져오는 것을 반복해서 1의 자리의 수를 모두 채우면 10의자리, 10의 자리를 채운뒤에 100의 자리, … $10^{18}$자리 까지 채우는 것을 반복하여 모두 채우는 데에 필요한 박스들의 수를 채우면 된다.

J : 풀리지 않은 문제들 중에 그나마 풀만해 보여서 edenooo님과 같이 잡았다. $3 \leq a, b, c$이 가장 중요한 제한으로, $c = 0, 1 \leq a$인 경우에 항상 풀 수 있는 방법이 있어서 케이스를 열심히 나눠봤다. $c \bmod 3$의 3가지 경우를 처리하면서 a가 1이상인 경우가 되도록 만들 수 있어서 문제를 해결했다.

Aeren님이 구현이 힘든 F를 푸시고, edenooo님이 파싱은 어렵지만 풀이가 나온 D, 내가 대회 종료 15분 전에 풀이를 찾은 L을 각각 맡았는데, F는 맞왜틀, D는 구현 시간 부족, L는 코딩 큐가 오지도 않아 그대로 사망했다. 근데 F가 파일입출력에서 바로 fclose를 하지 않고 exit()를 쓰면 출력이 나오지 않는다는 게 틀린 원인이었어서 맞은걸로 쳐도 되지 않을까 한다.

중간에 D 파싱이 어렵지 않은 걸로 착각해서 내가 15분쯤 사용했는데 그대로 망해서 edenooo님이 코드를 갈아 엎고 새로 짜셨다.

Upsolved

L : 풀이는 맞았지만 구현 방법에서 틀려서 한참을 해메다가 데이터를 뜯어보고 맞았다. 왼쪽 위에서 오른쪽 아래로 가는 경로가 있다는 것은 왼쪽 아래에서 오른쪽 위로 #을 타고 가는 경로(대각선 포함)이 없다는 것이므로 왼쪽 아래와 오른쪽 위를 이어주는 정사각형을 찾으면 된다. dp를 이용해 해당 지점에서 뻗을 수 있는 가장 큰 정사각형의 크기를 찾을 수 있고, 이 길이는 이분탐색이 가능하기 때문에 섞어주면 $O(N^2 \log N)$으로 문제가 풀린다.

D : edenooo님의 풀이 방향을 들어서 쉽게 풀 수 있을거라 생각했지만, 이곳 저곳의 typo와 빈칸은 처리하지 않는 것, 그리고 I를 잘못 처리해서 a*Ib = aab 가 성립하게 된게 문제여서 데이터를 뜯어보면서 고쳤다. 연습 중간에 엎기 전 코드를 조금 많이 생각해서인지 생각보다 파싱에 고통받지는 않았다.

더 읽어보기 »

[백준 1446] 지름길

작성일 2021-01-25 | In PS |

문제 링크

https://www.acmicpc.net/problem/1446

더 읽어보기 »

[백준 1342] 행운의 문자열

작성일 2021-01-25 | In PS |

문제 링크

https://www.acmicpc.net/problem/1342

더 읽어보기 »

[백준 5427] 불

작성일 2021-01-25 | In PS |

문제 링크

https://www.acmicpc.net/problem/5427

더 읽어보기 »

[백준 1107] 리모컨

작성일 2021-01-25 | In PS |

문제 링크

https://www.acmicpc.net/problem/1107

더 읽어보기 »

[백준 1092] 배

작성일 2021-01-24 | In PS |

문제 링크

https://www.acmicpc.net/problem/1092

더 읽어보기 »

[백준 1089] 스타트링크 타워

작성일 2021-01-24 | In PS |

문제 링크

https://www.acmicpc.net/problem/1089

더 읽어보기 »

[백준 1038] 감소하는 수

작성일 2021-01-24 | In PS |

문제 링크

https://www.acmicpc.net/problem/1038

더 읽어보기 »

[백준 1034] 램프

작성일 2021-01-24 | In PS |

문제 링크

https://www.acmicpc.net/problem/1034

더 읽어보기 »
1 2 3
github chart
JooDdae

JooDdae

29 포스트
2 카테고리
2 태그
RSS
© 2023 JooDdae
Powered by Jekyll
Theme - NexT.Muse