Codeforces Round #669 (Div. 2) C. Chocolate Bunny (交互,构造)
-
题意:有一个长度为\(n\)的隐藏序列,你最多可以询问\(2n\)次,每次可以询问\(i\)和\(j\)位置上\(p[i]\ mod\ p[j]\)的结果,询问的格式是\(?\ x\ y\),如果已经确定序列了,先输出\(!\),然后输出序列.
-
题解:首先要知道一个结论,\(p[i]\ mod \ p[j]=cnt1\),\(p[j]\ mod \ p[i]=cnt2\),如果\(cnt1>cnt2\),那么\(p[i]\)一定是相对较小的数,所以\(p[i]=cnt1\),那么应用到题目当中,我们每次询问两个相对位置结果,则必然可以确定一个数,然后维护一个最大值和其他值去j比较就能做到线性.具体看代码.
-
代码:
int n; int res[N]; int check(int x,int y){ cout<<"? "<<x<<" "<<y<<endl; int k; cin>>k; return k; } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n; int mx=1; for(int i=2;i<=n;++i){ int cnt1=check(mx,i); int cnt2=check(i,mx); if(cnt1>cnt2){ res[mx]=cnt1; mx=i; } else{ res[i]=cnt2; } } res[mx]=n; cout<<"! "<<endl; for(int i=1;i<=n;++i) cout<<res[i]<<" "; cout<<endl; return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮