起床困難綜合症
阿新 • • 發佈:2020-07-28
題目
題解
位運算一個很重要的性質,位與位之間不會互相影響。
我採用的做法是從大到小判斷每一位取多少結果是\(1\)。
時間複雜度:\(O(nlogn)\)
對於每一位我們暴力代\(1\)或\(0\)進去,然後看結果是不是\(1\)就行了,如果都是\(1\)我們這一位優先取\(0\),給後面的點創造更多可以選擇的空間。
程式碼
#include<cstdio> #include<cstring> #define N 110000 using namespace std; struct node { int type,x; }a[N];int n,m; int ans=0;//答案 bool pd(int x,int k/*第k位是不是1*/) { for(int i=1;i<=n;i++) { if(a[i].type==1)x&=a[i].x; else if(a[i].type==2)x|=a[i].x; else x^=a[i].x; } return x&(1<<k); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { char st[10];scanf("%s",st+1); scanf("%d",&a[i].x); if(st[1]=='A')a[i].type=1; else if(st[1]=='O')a[i].type=2; else a[i].type=3; } for(int i=30;i>=0;i--) { if(pd(0,i)==1)ans+=(1<<i); else if((1<<i)<=m/*要判斷數字是否在1-m範圍內*/ && pd((1<<i),i)==1)ans+=(1<<i),m-=(1<<i); } printf("%d\n",ans); return 0; }