DOJ logoDOJ
Problems
Recently added problemsSaved problems
CategoriesDLCContestsGroupsTeamsBoard
Ranking
Solved Problem RankingStreak rankingDOJ Power ranking
Status
Call for TasksLoginRegister
DOJ logoDOJ

Community online judge with OI-style subtask scoring, Elo ratings, and Discord-backed certification.

Problems
ProblemsCategories
Community
ContestsRankingBoardNoticesHost an external contestGuide
Account
LoginRegisterJudge Status
Policy
Terms of ServiceDLC RulesPrivacyAPI documentationLanguage runtimesContest rank rewardsRating and performance
© 2026 DOJ
All rights reserved
Editorial

적분

Back to problem

Editorial

각 위치 iii에 대해

Di=Xi−YiD_i=X_i-Y_iDi​=Xi​−Yi​

라고 하자. 여기서 문자를 정수로 보아 0은 000, 1은 111로 생각한다. 그러면 DiD_iDi​는 −1,0,1-1,0,1−1,0,1 중 하나이다.

먼저 목적식을 DiD_iDi​로 바꾸자. SSS의 앞 iii글자에 포함된 1의 개수를 oneS(i)one_S(i)one라고 하면,

fS(i)=oneS(i)−(i−oneS(i))=2oneS(i)−if_S(i)=one_S(i)-(i-one_S(i))=2one_S(i)-ifS​(i)=oneS​

이다. 따라서

fX(i)−fY(i)=2(oneX(i)−oneY(i))=2∑j=1iDjf_X(i)-f_Y(i)=2(one_X(i)-one_Y(i))=2\sum_{j=1}^{i}D_jfX​(i)−fY

이다. 그러므로 전체 목적식은

2∑i=1N∑j=1iDj=2∑j=1NDj(N−j+1)2\sum_{i=1}^{N}\sum_{j=1}^{i}D_j = 2\sum_{j=1}^{N}D_j(N-j+1)2i=1∑N​j=1

이다.

이제 연산이 DDD에 어떤 영향을 주는지 보자. 구간 [l,r][l,r][l,r]에서 XXX와 YYY의 1 개수가 같다는 것은

∑i=lrDi=0\sum_{i=l}^{r}D_i=0i=l∑r​Di​=0

이라는 뜻이다. 이 구간을 서로 바꾸면, 해당 구간의 모든 DiD_iDi​는 부호가 바뀐다. 즉 DiD_iDi​가 111이면 −1-1이 되고, 이면 이 되며, 은 그대로 이다.

따라서 문제는 다음과 같이 바뀐다.

Di∈{−1,0,1}D_i \in \{-1,0,1\}Di​∈{−1,0,1}인 수열이 있다. 합이 000인 연속구간의 부호를 원하는 만큼 뒤집을 수 있다. 이때

∑i=1NDi(N

Di=0D_i=0Di​=0인 위치는 어떤 연산을 해도 계속 000이다. 이제 Di≠0D_i \ne 0Di​인 위치들만 보자. 만약 어떤 두 비영 위치 사이에 이 먼저 나오고, 그 뒤에 이 나오며 그 사이가 모두 이라면, 그 전체 구간의 합은 이다. 이 구간을 뒤집으면

S
​
(
i
)
(
i
)
−
(i−
oneS​(i))=
2oneS​(i)−
i
​
(
i
)
=
2(oneX​(i)−
oneY​(i))=
2j=1∑i​Dj​
∑
i
​
Dj​
=
2j=1∑N​Dj​(N−
j+
1)
−
1
−1-1−1
111
000
000
−i+1)\sum_{i=1}^{N}D_i(N-i+1)
i=1∑N​Di​(N−i+1)

를 최대화하여라.

=
0
−1-1−1
111
000
000
−1, 0, 0, …, 0, 1-1,\ 0,\ 0,\ \ldots,\ 0,\ 1−1, 0, 0, …, 0, 1

이

1, 0, 0, …, 0, −11,\ 0,\ 0,\ \ldots,\ 0,\ -11, 0, 0, …, 0, −1

이 된다. 즉 비영 위치들만 보면 인접한 −1,1-1,1−1,1을 1,−11,-11,−1로 바꿀 수 있다.

이 연산을 반복하면, Di≠0D_i \ne 0Di​=0인 위치들에서 모든 111을 앞쪽으로, 모든 −1-1−1을 뒤쪽으로 보낼 수 있다. 또한 연산은 111의 개수와 −1-1−1의 개수를 바꾸지 않으므로, 이보다 더 앞쪽에 111을 많이 놓을 수는 없다.

가중치 N−i+1N-i+1N−i+1은 iii가 작을수록 크다. 따라서 최적 상태는 다음과 같다.

  • Di≠0D_i \ne 0Di​=0인 위치들을 왼쪽부터 모은다.
  • 그중 앞에서부터 원래 Di=1D_i=1Di​=1이었던 개수만큼 111을 배치한다.
  • 나머지 비영 위치에는 −1-1−1을 배치한다.
  • Di=0D_i=0Di​=0인 위치는 계속 000이다.

따라서 구현은 간단하다. Di≠0D_i \ne 0Di​=0인 위치들을 배열에 저장하고, Di=1D_i=1Di​=1인 개수를 PPP라고 하자. 비영 위치 배열을 pospospos라고 하면 최댓값은

2(∑t=0P−1(N−post)−∑t=P∣pos∣−1(N−post))2\left( \sum_{t=0}^{P-1}(N-pos_t) - \sum_{t=P}^{|pos|-1}(N-pos_t) \right)2​t=0∑P−1​(N−post​)−t=P∑∣pos∣−1​(N−post​)​

이다. 여기서 구현에서는 postpos_tpost​를 000-indexed 위치로 저장했기 때문에 가중치가 N−postN-pos_tN−post​가 된다.

시간 복잡도는 O(N)O(N)O(N)이고, 메모리 복잡도는 O(N)O(N)O(N)이다.