题解:P10539 [APIO2024] 魔术表演
WaTleZero_pt · · 题解
根据题意,很显然,我们只需要想办法传递
为了避免被毒瘤交互库卡掉,我们要让生成的树尽可能均匀,让交互库无法猜测到每个点或边的功能,或者即使可能被交互库卡也要尽可能提高正确率。我们考虑一些非常神奇的做法:
我们将这
我们将第
至于前面
这样做唯一的弱点就是在交互库删除叶子节点所连接的边是会导致正确率降低,但是大致估测凭感觉发现这样的边数通常大于
如果你怕被卡也可以选定一个随机种子,把点的编号打乱(事实证明这种方法对于毒瘤的交互库来说几乎没用),当然我没有打乱也过了。
#include<bits/stdc++.h>
using namespace std;
long long setN(int n);
#include<bits/stdc++.h>
using namespace std;
long long setN(int n);
vector<pair<int,int> > Alice(){
long long t=setN(5000);
mt19937 rnd(time(0));
vector<pair<int,int> > res;
bool tag;int x;
for(int i=0;i<60;i++){
tag=(t&(1ll<<i))>0;
for(int j=2501+i;j<=5000;j+=60)
res.push_back(make_pair(tag?(x=rnd()%1250+1):(x=rnd()%1250+1251),j));
}
for(int i=2;i<=2500;i++)
res.push_back(make_pair(rnd()%(i-1)+1,i));
return res;
}
long long Bob(vector<pair<int,int> > g){
long long ans=0;
for(pair<int,int> e:g){
if(e.first<=1250&&e.second>2500){
ans|=(1ll<<((e.second-2501)%60));
}
}
return ans;
}