魚和熊掌不可兼得

2021-10-01 07:59:44 字數 1753 閱讀 4643

互動。每次可以詢問乙個排列,返回這個排列與答案排列相同位置的個數,求出這個答案排列。

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...