日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【做题记录】CF1451E2 Bitwise Queries (Hard Version)

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【做题记录】CF1451E2 Bitwise Queries (Hard Version) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CF1451E2 Bitwise Queries (Hard Version)

題意:

\(n\) 個數( \(n\le 2^{16}\) ,且為 \(2\) 的整數次冪,且每一個數都屬于區間 \([0,n-1]\) ) 可以通過詢問交互庫不超過 \(n+1\) 次詢問,每次詢問編號為 \(i,j\) ( \(1\le i,j \le n\)\(i\ne j\) ) 的 XOR 、OR 或 AND ,求出這 \(n\) 個數 。

題解:

分類討論,先對 \(2-n\)\(n-1\) 個數每個數都與 \(1\) 詢問一次 XOR ,之后考慮 \(2\) 次求出 \(a_1\)

  • 所有數都互不相同

    此時所有 \(xor\) 值都不相同且都不等于 \(0\) ,可以分別找出 \(xor_i=1\)\(xor_j=n-2\) 的數,用 \(1\) 一次 \(and\) 詢問求出 \(a_1\) 的前 \(m\) 位與最后一位 。

  • 有些數相同

    那些數的 \(xor\) 值相同 。

    • 有些數與 \(a_1\) 相同

      找出 \(xor_i=0\) 的數,與 \(1\) 詢問 AND ,直接求出 \(a_1\)

    • 有些數相同,但不等于 \(a_1\)

      找出兩個 \(xor\) 相同的數,用 \(1\) 次詢問求出 \(a_i\) ,進而用之前詢問求得的 \(xor_i\) 求出 \(a_1\)

代碼:

#include<bits/stdc++.h> using namespace std; #define Maxn 65540 inline int rd() {int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x; } int n,Xor[Maxn],ans[Maxn],vis[Maxn]; bool All=true; inline int XOR(int x,int y) {printf("XOR %d %d\n",x,y),fflush(stdout);return rd(); } inline int AND(int x,int y) {printf("AND %d %d\n",x,y),fflush(stdout);return rd(); } int main() {//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=rd();for(int i=2;i<=n;i++){Xor[i]=XOR(1,i);if(vis[Xor[i]] || Xor[i]==0) All=0;vis[Xor[i]]=1;}if(All){for(int i=2;i<=n;i++){if(Xor[i]==1) ans[1]|=AND(1,i);if(Xor[i]==n-2) ans[1]|=AND(1,i);}}else{if(vis[0]){for(int i=2;i<=n;i++) if(!Xor[i]) { ans[1]=AND(1,i); break; }}else{for(int i=0;i<=n-1;i++) vis[i]=0;for(int i=2;i<=n;i++){if(vis[Xor[i]]) { ans[1]=Xor[i]^AND(vis[Xor[i]],i); break; }vis[Xor[i]]=i;}}}for(int i=2;i<=n;i++) ans[i]=ans[1]^Xor[i];printf("! ");for(int i=1;i<=n;i++) printf("%d%c",ans[i],(i==n)?'\n':' ');fflush(stdout);//fclose(stdin);//fclose(stdout);return 0; }

總結

以上是生活随笔為你收集整理的【做题记录】CF1451E2 Bitwise Queries (Hard Version)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。