DOJ logoDOJ
题目
最近添加的题目收藏的题目Workbooks
分类DLC比赛小组团队讨论区
排名
解题数量排行榜连续解题排名DOJ Power 排行榜
评测状态
征题登录注册
DOJ logoDOJ

支持 OI 子任务计分、Elo 等级分和 Discord 认证的社区在线评测系统。

题目
题目列表分类
社区
比赛排名讨论区公告举办外部比赛指南
账号
登录注册评测状态
政策
服务条款DLC 使用规则隐私政策API 文档语言运行环境比赛排名奖励评级与表现
© 2026 DOJ
保留所有权利
题解

Three Permutations and Queries

返回题目

题解

두 값 x,yx,yx,y에 대하여, 세 순열 중 적어도 두 순열에서 xxx가 yyy보다 앞에 나오면 x→yx \to yx→y라는 방향을 두자. 모든 두 값 사이에는 정확히 한 방향이 정해지므로 이는 토너먼트이다. 좋은 순열이 존재한다는 것은 이 토너먼트의 모든 간선 방향과 일치하는 선형 순서가 존재한다는 뜻이고, 이는 토너먼트가 추이적이라는 것과 동치이다.

각 값 xxx에 대해 다음 값을 정의하자.

d[x]=#{y:세 순열 중 적어도 두 순열에서 y가 x보다 앞에 나온다}.d[x]=\#\{y:\text{세 순열 중 적어도 두 순열에서 }y\text{가 }x\text{보다 앞에 나온다}\}.d[x]=#{y:세 순열 중 적어도 두 순열에서 y가 x보다 앞에 나온다}.

즉, d[x]d[x]d[x]는 위 토너먼트에서 xxx의 진입 차수이다.

추이적인 토너먼트의 진입 차수들은 정확히 0,1,⋯ ,N−10,1,\cdots,N-10,1,⋯,N−1이다. 반대로 모든 d[x]d[x]d[x]가 서로 다르면 각 값이 000 이상 N−1N-1 이하이므로 진입 차수 집합은 정확히 이다. 진입 차수가 인 정점은 모든 다른 정점보다 앞에 놓여야 한다. 이 정점을 제거하면 남은 토너먼트의 진입 차수도 다시 가 되므로 귀납적으로 토너먼트는 추이적이다. 따라서 좋은 순열이 존재하는 필요충분조건은 모든 가 서로 다른 것이다.

초기 d[x]d[x]d[x]를 빠르게 구해야 한다. 순열 uuu에서 값 xxx의 위치를 pos⁡u[x]\operatorname{pos}_u[x]posu​[x]라고 하자. 두 순열 에 대해

Cuv[x]=#{y:pos⁡u[y]<pos⁡u[x], pos⁡v[y]<pos⁡v[x]}C_{uv}[x]=\#\{y:\operatorname{pos}_u[y]<\operatorname{pos}_u[x],\ \operatorname{pos}_v[y]<\operatorname{pos}_v[x]\}Cuv​[x]=#{y

로 두고, 세 순열 모두에서 앞서는 값의 수를 Cpqr[x]C_{pqr}[x]Cpqr​[x]라고 하자. 어떤 yyy가 세 순열 중 정확히 kkk개에서 xxx보다 앞선다고 하면 에는 번, 에는 일 때 한 번 포함된다. 따라서

d[x]=Cpq[x]+Cpr[x]+Cqr[x]−2Cpqr[x].d[x]=C_{pq}[x]+C_{pr}[x]+C_{qr}[x]-2C_{pqr}[x].d[x]=Cpq​[x]+C

각 CuvC_{uv}Cuv​는 한 순열의 순서대로 훑으면서 다른 순열의 위치를 Fenwick tree에 넣으면 O(Nlog⁡N)O(N\log N)O(NlogN)에 구할 수 있다. CpqrC_{pqr}C는 세 위치를 좌표로 보는 3차원 dominance counting이다. 의 위치 순서로 정렬한 뒤 CDQ divide and conquer와 Fenwick tree를 사용하면 에 모든 값을 구할 수 있다.

이제 쿼리를 보자. 현재 선택된 순열에서 서로 인접한 두 값이 x,yx,yx,y이고, swap 전에는 xxx가 yyy보다 앞에 있다고 하자. 인접한 두 원소를 바꾸면 그 순열 안에서 상대적인 순서가 바뀌는 쌍은 (x,y)(x,y)(x,y) 하나뿐이다. 따라서 다수결 토너먼트에서도 바뀔 수 있는 간선은 x,yx,yx 사이의 간선 하나뿐이다.

나머지 두 순열에서 x,yx,yx,y의 순서가 같다면 다수결 결과는 선택된 순열과 관계없이 이미 정해져 있으므로 아무 변화가 없다. 나머지 두 순열에서 x,yx,yx,y의 순서가 서로 다르다면 swap 전에는 x→yx\to yx→y, swap 후에는 y→xy\to xy→x가 된다. 그러므로 이 경우에만

d[x]+=1,d[y]−=1d[x]\mathrel{+}=1,\qquad d[y]\mathrel{-}=1d[x]+=1,d[y]−=1

로 갱신하면 된다.

각 가능한 진입 차수 0,1,⋯ ,N−10,1,\cdots,N-10,1,⋯,N−1의 등장 횟수를 유지하자. 등장 횟수가 222 이상인 값의 개수를 함께 관리하면, 그 개수가 000일 때 그리고 그때에만 모든 d[x]d[x]d[x]가 서로 다르다. 한 쿼리에서 최대 두 개의 만 바뀌므로 이 부분은 이다. 세 순열의 현재 위치 배열도 swap과 함께 갱신하면 나머지 두 순열이 서로 같은 순서를 가지는지 에 판정할 수 있다.

초기화 시간복잡도는 O(Nlog⁡2N)O(N\log^2 N)O(Nlog2N), 각 쿼리는 O(1)O(1)O(1)이다. 전체 시간복잡도는 O(Nlog⁡2N+M)O(N\log^2 N+M)O(N이고, 메모리복잡도는 이다.

Solution written by GPT5.6

N
−
1
{0,1,⋯ ,N−1}\{0,1,\cdots,N-1\}{0,1,⋯,N−1}
000
0,1,⋯ ,N−20,1,\cdots,N-20,1,⋯,N−2
d[x]d[x]d[x]
u,vu,v
u,v
:
posu​[y]<
posu​[x], posv​[y]<
posv​[x]}
Cpq+Cpr+CqrC_{pq}+C_{pr}+C_{qr}
Cpq​+Cpr​+Cqr​
(k2)\binom{k}{2}(2k​)
CpqrC_{pqr}Cpqr​
k=3k=3k=3
pr​
[
x
]
+
Cqr​[x]−
2Cpqr​[x].
pqr
​
ppp
O(Nlog⁡2N)O(N\log^2 N)O(Nlog2N)
,
y
ddd
O(1)O(1)O(1)
O(1)O(1)O(1)
log2
N
+
M)
O(N)O(N)O(N)