편의상 인덱스를 0부터 N−1까지 사용한다. 모든 인덱스는 N으로 나눈 나머지로 해석한다.
같은 시작점에서 연산을 두 번 하면 서로 상쇄된다. 따라서 시작점 i에서 연산을 홀수 번 하는지를 xi∈{0,1}로 두면 충분하다.
위치 i가 최종적으로 0이 되려면
ai=j=i−K+1⨁i
가 성립해야 한다. 인접한 두 식을 XOR하면
xi⊕xi−K=
를 얻는다.
d=gcd(N,K), m=N/d, h=K/라 하자. 는 정확히 개의 길이 인 순환으로 분해된다.
나머지 클래스 r에 대해
Pr=i≡r(modd)⨁
라 하자. 한 순환에서 모든 차분식을 XOR한 값은 Pr⊕Pr−1이다. 따라서 차분식이 모순 없이 풀리기 위한 필요충분조건은
P0=P1=⋯=P
이다.
각 순환을
vt=r+tK(modN),
순서로 놓는다. 한 canonical 해를
xv0=0,x
로 잡는다. 순환 r에서 x가 1인 개수를 cr라 하자.
차분식만 보면 각 순환 전체를 뒤집는 자유변수 yr가 하나씩 있다. yr=0의 비용은 , 의 비용은 이다. 따라서 차분식만 만족시키는 최소 비용은
B=r∑min(cr,m−c
이다.
차분식은 원래 식들의 차이만 사용했으므로 원래 식 하나를 더 맞춰야 한다. 위치 0의 식에 대한 잔여값을
E=a0⊕j=−K+1⨁0
라 하자. 목표는 E=0이다.
길이 K인 구간에는 각 나머지 클래스의 원소가 정확히 h=K/d개씩 들어간다.
h가 짝수이면 한 순환 전체를 뒤집어도 E가 변하지 않는다. 따라서 E=1이면 불가능하고, E=0이면 답은 B이다.
h가 홀수이면 각 yr가 E를 한 번씩 뒤집는다. 즉
y0⊕y1⊕⋯⊕y
를 만족해야 한다. 비용만 보고 선호하는 선택을
zr=[cr>m/2],
라 하자. Z=E이면 답은 B이다. 그렇지 않으면 순환 하나의 선택을 반대로 해야 하며 추가 비용은
rmin∣m−2cr∣
이다.
이제 쿼리를 처리한다. ap를 뒤집으면 Δp와 Δ만 뒤집히고, 만 뒤집힌다. 따라서 모든 가 같은지는 인 클래스의 개수만 관리하면 에 판별할 수 있다.
순환 안에서 Δvs가 뒤집히면 s≥1일 때 canonical 해의
xvs,xv
가 모두 뒤집힌다. s=0인 Δv0는 순환의 닫힘 조건에만 쓰이므로 canonical 해 자체는 바뀌지 않는다.
모든 순환을 순환 순서대로 이어 붙인 길이 N 배열을 만들고, 구간 뒤집기와 구간의 1 개수 질의를 지원하는 lazy segment tree를 사용한다. 각 쿼리는 suffix 뒤집기 최대 두 번과 영향을 받은 순환의 cr 재계산만 필요하다.
각 순환의 cr가 바뀔 때 다음 값을 함께 갱신한다.
- B=∑rmin(cr,m−c
E도 매번 직접 다시 계산할 필요가 없다. 각 Δu를 뒤집을 때 canonical 해에서 뒤집히는 suffix가 E의 길이 K 구간과 몇 개 겹치는지의 홀짝을 로 전처리한다. 순환의 시작점에서는 이다. 쿼리 에 대해
E⊕=[p=0]⊕impact[p]⊕impact
로 갱신할 수 있다.
따라서 각 쿼리의 답은 다음과 같다.
- Pr들이 모두 같지 않으면
-1.
- h가 짝수이면 E=1일 때
-1, 아니면 B.
- 가 홀수이면 .
각 테스트 케이스의 전처리는 O(NlogN), 각 쿼리는 O(logN)이다. 전체 시간복잡도는 O((N+Q이고 메모리는 이다.
Solution written by GPT5.6