[codeforces] 1906F. Maximize The Value

starbow·2024년 5월 24일

PS/CP

목록 보기
5/25

문제 링크
크기가 NN인 배열 AA가 있습니다. 처음에는 모든 ii에 대하여 Ai=0A_{i} = 0입니다.

그리고 배열에 적용할 MM개의 연산이 주어집니다. Li,Ri,Xi\langle L_{i}, R_{i}, X_{i} \rangle 형태로 주어지며 이는 LijRiL_{i} \leq j \leq R_{i}인 모든 jj에 대하여 AjA_{j}XiX_{i}만큼 증가시킵니다.

마지막으로 QQ개의 독립적인 쿼리가 주어집니다. K,S,T\langle K, S, T \rangle 형태로 주어지며 이는 SlrTS \leq l \leq r \leq Tl,rl, r을 골라 AAll번째 부터 rr번째 연산을 순서대로 적용시켜 얻을 수 있는 AKA_{K}의 최댓값을 반환합니다. 저희는 이 쿼리를 수행하는 코드를 짜야합니다.

크기가 N×MN \times M이고 Bi,j={Xj,LjiRj0,otherwiseB_{i, j} = \begin{cases} X_{j}, & L_{j} \leq i \leq R_{j} \\ 0, & \text{otherwise} \end{cases} 인 2차원 배열 BB를 생각해봅시다. 첫번째 예제에 대해서 배열 BB를 만들면 아래와 같습니다.

이렇게 하면 ll번째 부터 rr번째 연산을 순서대로 모두 적용했을 때 AK=c=lrBK,cA_{K} = \displaystyle\sum_{c=l}^{r}{B_{K, c}}가 됩니다.
즉, 첫번째 예제의 첫번째 쿼리는 아래 그림의 색칠 된 부분에 포함되면서 연속적인 부분들 중 그 합이 최대인 값을 찾아주면 됩니다.

최대가 되는 경우는 아래와 같습니다.

이렇게 하면 누적합을 사용해서 처리할 수 있기 때문에 시간복잡도와 공간복잡도 모두 O(NM+Q)O(NM + Q)이 됩니다. NNMM은 최대 10만이므로 이 방법은 사용할 수 없습니다.
그럼 어떻게 시간복잡도와 공간복잡도를 줄여야할까요? 여기서 두가지 사실에 주목해봅시다.

  • BB의 각 열을 위에서부터 아래로 순서대로 따라가면 값은 최대 2번 바뀝니다.
  • AKA_{K}BBKK번째 행에만 의존합니다.

즉, 1차원 배열을 만들어서 BB의 첫번째 행으로 초기화 해준 뒤, 아래로 스위핑하면서 1차원 배열을 갱신해 가며 각 쿼리의 값을 구할 수 있습니다. 각 쿼리들은 오프라인으로 KK의 값이 작은 순서대로 처리하면 되고 1차원 배열의 갱신과 각 쿼리의 값은 세그먼트 트리를 사용해서 처리할 수 있습니다.

시간복잡도는 O(QlogQ+MlogM)O(Q\log{Q}+M\log{M}), 공간복잡도는 O(Q+M)O(Q+M)으로 AC를 받을 수 있습니다.

profile
🎈 Journey of problem solving

0개의 댓글