CodeForce - Lucky Queries(145E)
문제(링크) 세그먼트 트리 레이지 프로퍼게이션 문제였습니다. TF[now] = 현재 구간에서의 왼쪽->오른쪽 방향의 최장 수열 길이 TB[now] = 현재 구간에서의 오른쪽->왼쪽 방향의 최장 수열 길이 c4[now] = 현재 구간의 4의 개수 c7[now] = 현재 구간의 7의 개수 현재 노드의 최장 수열의 길이를 구하려면 max((왼쪽 노드의 최장 수열 길이 + 오른쪽 노드의 7의 개수), (오른쪽 노드의 최장 수열 길이) + (왼쪽 노드의 4의 개수)) 가 됩니다. 왜냐하면 왼쪽에서 최장 수열의 길이를 이미 구했다고 가정하고, 오른쪽에 7의 개수만 세어주면 되는데, 오른쪽에 4가 오는 경우는 두 번째 조건에서 찾게 됩니다. 즉, 오른쪽에 4가 오는 경우는 (오른쪽 노드의 최장 수열 길이)에 포함되어 있습니다. 마찬가지로 오른쪽 최장 수열 길이를 이미 구했다면 왼쪽에 올 수 있는 건 4밖에 없습니다. 위에서 TF를 구했고, TB는 반대로만 해주면 됩니다. 위 방법만을 이용하면 결과는 TF[1](Root) 에 저장되지만, 시간 초과가 나므로 레이지 프로퍼게이션을 적용해야 합니다. 774 777 위 두개를 자식노드로 하고 있다고 가정해 봅시다. 774의 TB는 3입니다. 4->7->7 이므로 774를 뒤집으면, TF는 3이 나옵니다. 4->4->7 이므로 즉, 뒤집은 다음의 TF는 뒤집기 전 TB와 같습니다. 따라서 774777의 TF를 구하려면 (774의 TB + 777의 4의 개수)와 -- 4의 개수? = 4가 뒤집히면 7이 되므로 같은 방식으로 (777의 TB + 774의 7의 개수) 중 큰 값을 구하면 됩니다. 이제 어떤 노드 n 에 대하여 n의 구간을 모두 뒤집을 때 TF의 값을 구할 수 있었습니다. 같은 방식으로 TB도 구할 수 있습니다. 물론 자신의 c4, c7의 개수도 서로 바꿔 줍니다. 지금까지 구한 게 레이지 프로퍼게이션 중 일부인데, 이제 자식...