返回顶部

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;
    }
    
posted @ 2020-09-12 20:30  _Kolibri  阅读(127)  评论(0)    收藏  举报