ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023 IOI 멘토교육 4주차
    일기장 2023. 5. 24. 09:05

    BOI 2022 Day 1을 돌았다.

    0:00 ~ 0:17

    1번 문제를 읽었다. 순열을 쿼리로 날리면 inversion 개수를 알 수 있을 때 N번 이하의 쿼리로 원래 순열을 복원해야한다. 순열을 N번 rotate하면서 넣으면 각 원소의 등수를 알 수 있기 때문에 쉽게 풀린다.

    0:17 ~ 1:05

    2번 문제를 읽었다. 섭태 풀이가 대부분 쉬웠고 100점 풀이도 쉬울 것 같아서 조금 고민해보기로 했다. 시작에서 끝으로 가는건 최적화하기 까다로워서 거꾸로 끝에서 시작으로 가는 방식을 생각해봤고 문제가 더 간단해졌다. 스파스테이블을 이용한 100점 풀이를 바로 짰고 AC를 받았다.

    1:05 ~ 3:52

    3번 문제를 읽었다. 가중치가 -M이상 M이하의 정수로 bound되어있을 때 M에 대한 다항시간으로 냅색을 해결해야한다. 1시간 넘게 고민해서 다항시간 풀이를 찾아냈다. 일단 x개를 뽑았을 때 최대와 최소 범위에 M가 속하는 최대 x를 이분탐색을 이용해서 찾을 수 있다. 이러한 x를 찾고 나면 좋은 성질이 성립하게 된다. 

    일반성을 잃지 않고 x일 때 최소가 L과 M이하로 차이난다고 하자. (아닐 경우 최대가 그렇기 때문에 배열 뒤집고 L도 부호를 바꾸면 된다.) x일 때 최소를 선택한 상태에서 최적해로 바꾸는 시행을 생각해보면 어떤 원소를 추가하거나 제거하게 된다. 이러한 시행이 2M+2개 이상일 경우, 비둘기집의 원리에 의해 시행의 일부를 제거하는 것이 가능함을 보일 수 있다. 따라서, O(M)번의 시행으로 최적해로 만들 수 있다.

    여기서 단순 냅색을 하게 되면 가중치 범위가 O(M^2), 시행 횟수가 O(M)이므로 dp table 크기가 O(M^3)이 되고, 각 원소별 최대 O(M)번 선택 가능하므로 O(M^2)번 전이를 하게 되어 O(M^5)에 문제를 해결할 수 있다.

    비트셋을 이용하면 /64를 붙일 수 있고 M<=100까지 긁을 수 있다.

    3:52 ~ 5:00

    이후 100점 풀이를 찾으려고 M을 시간복잡도에서 떼려고 해봤지만 잘 되지 않았다. 결국 100+100+80=280점으로 끝났다.

     

    3번 100점을 받기 위해서는 dp 정의를 약간 바꿔서 dp[S] = (현재 상태에서 가중치 변화량이 S이기 위한 최소 감소 개수)로 놓으면 상태가 O(M^2)가 되고 dp table 갱신도 O(M^2)만큼 걸리게 된다. 이를 아까처럼 O(M^2)번 하면 O(M^4)이고, 같은 가중치 원소를 덱dp를 이용해서 한번에 처리해주면 O(M^3)에 문제를 해결할 수 있다.

    '일기장' 카테고리의 다른 글

    IOI 2023 후기  (3) 2023.09.11
    2023 IOI 멘토교육 5주차  (0) 2023.05.29
    2023 IOI 멘토교육 3주차  (0) 2023.05.14
    2023 IOI 멘토교육 2주차  (0) 2023.05.07
    2023 IOI 멘토교육 1주차  (0) 2023.04.29

    댓글

Designed by Tistory.