互動。每次可以詢問乙個排列,返回這個排列與答案排列相同位置的個數,求出這個答案排列。
n ≤5
×103
;que
ries
≤5×1
04
n \le 5 \times 10^3;queries \le 5 \times 10^4
n≤5×10
3;qu
erie
s≤5×
104考慮先求出乙個錯排,那答案會形如若干個置換環的形式。所以我們的目標是在 (n−
1)×n
2\frac
2(n−1)
×n 條邊中,選出 n
nn 條有效邊。
考慮有效邊的性質,即交換這個有效邊的端點數值,詢問結果會增加。所以對於每條邊 (i,
j)
(i,j)
(i,j
) ,考慮按照 (i+
j)%n
(i+j)\%n
(i+j)%
n 分組,每組每條邊的兩個端點就互不相同,那我們可以用類似分治的方法求出哪些邊是有效的,最後定向即可。
#include
"game.h"
using
namespace std;
const
int n=
5005
;struct o
;vectorp[n]
,h;vector<
int>f[n]
,a;int g[n<<2]
,s[n]
,cnt,lst,d[n]
;bool vis[n]
;boolj(
int u)
void
add(
int u,
int v)
void
find
(int k,
int i,
int l,
int r)
int ls=
(k<<1)
,rs=
(ls|1)
,mid=
(l+r)
>>1;
for(
int j=l;j<=mid;j++
)swap
(a[p[i]
[j].x]
,a[p[i]
[j].y]);
g[ls]
=count
(a);g[rs]
=g[k]
-g[ls]
;for
(int j=l;j<=mid;j++
)swap
(a[p[i]
[j].x]
,a[p[i]
[j].y]);
if(g[ls]
)find
(ls,i,l,mid);if
(g[rs]
)find
(rs,i,mid+
1,r);}
void
dfs(
int u)
}vector<
int>
guess
(int n,
int limit));
for(
int z,i=
0;i)for
(int i=
0,v;i(!vis[i]
) lst+
=cnt;
}return a;
}
(學軍集訓)魚和熊掌不可兼得
互動題。有乙個排列p,你每次可以詢問乙個排列ans,可以得到p與ans相同的位置有多少個 count ans 你需要在不超過limit的詢問次數內得出這個排列。資料範圍 n 5000,l imit 50000 n le5000,limit 50000 n 5000 lim it 5 0000 考慮在...
「魚」和「熊掌」也能兼得 省時省心
魚和熊掌 自古就有魚和熊掌不能兼得的典故。二者不可得兼,捨生而取義者也 當今社會,受利益驅使,紛紛擾擾眼花繚亂的產品很多,魚和熊掌不能兼得的事比比皆是。同樣是自己的產品,部署和相容性都有問題。運維軟體也是,現在的使用者要求都很高,且眾口難調。有嚮導的純flash的網路拓撲展現 省時省心 相對於c s...
「魚」和「熊掌」也能兼得 省時省心
魚和熊掌 自古就有魚和熊掌不能兼得的典故。二者不可得兼,捨生而取義者也 當今社會,受利益驅使,紛紛擾擾眼花繚亂的產品很多,魚和熊掌不能兼得的事比比皆是。同樣是自己的產品,部署和相容性都有問題。運維軟體也是,現在的使用者要求都很高,且眾口難調。有嚮導的純flash的網路拓撲展現 省時省心 相對於c s...