题意
交互题。
有一个排列p,你每次可以询问一个排列ans,可以得到p与ans相同的位置有多少个(count(ans)),你需要在不超过limit的询问次数内得出这个排列。
数据范围:
n
≤
5000
,
l
i
m
i
t
=
50000
n\le5000,limit=50000
n≤5000,limit=50000
题解
考虑在
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)次询问内求解。
直观的想法是逐位确定每一个数,但这样难免要在每一位枚举每一个数,不可行。考虑与概率期望有关的随机化算法,注意到一个排列的count为0的概率是较大的,随机出一个count=0的排列的期望次数为e。而错排又有一个美妙的性质:它到原排列是一个置换。考虑先找出置换中的无向边,再给边定向。无向边有n*(n-1)/2条,而交叉的无向边之间会相互影响,考虑将他们分为互不相交的若干组,对于每一组可用分治在总复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)内求出置换中的无向边(同“黄昏之时”)。发现对于边
(
u
,
v
)
(u,v)
(u,v)按照
(
u
+
v
)
(u+v)%n
(u+v)分组,每组都不相交,于是可求出。之后对于每一个判断举它往哪个方向置换即可。