起床困难综合症 NOI_2014_D1T1
这道题的正解其实没什么好说的,反而是部分分设计非常巧妙。
之所以要单开一篇是因为当时机房的部分同学刚学位运算,我拿这个题去讲想毒瘤大家一下,于是做了一个挺好看的课件。
ppt -> pdf -> jpg 是真的麻烦。(最后也没成功)
开始一个大工程...手工截图!
最后贴一下代码。
# include <cstdio> # include <iostream> # include <cmath> # define R register int using namespace std; int xx,n,Max=0,M,h=0,d[100009],y[100009],m[40],ans[40]; long long Ans=0; char a[5]; char cc; bool now,f=true; bool check(bool x,int l) { for (R i=1;i<=n;i++) { now=d[i]&(1<<(l-1)); if(y[i]==1) x=x&now; if(y[i]==2) x=x^now; if(y[i]==3) x=x|now; } return x; } int read() { xx=0; cc=getchar(); while (!isdigit(cc)) cc=getchar(); while (isdigit(cc)) xx=(xx<<3)+(xx<<1)+(cc^48),cc=getchar(); return xx; } int main() { cin>>n>>M; for (R i=1;i<=n;i++) { scanf("%s",a); d[i]=read(); if(a[0]=='A') y[i]=1; if(a[0]=='X') y[i]=2; if(a[0]=='O') y[i]=3; Max=max((int)log2(d[i])+1,Max); } while (M) { m[++h]=M&1; M=M>>1; } Max=max(Max,h)+1; for (R i=Max;i>=1;i--) { if((m[i]==1||f==false)&&check(1,i)==1&&check(0,i)==0) ans[i]=1; else { if(check(0,i)) ans[i]=1; if(m[i]==1) f=false; } } for (R i=Max;i>=1;i--) Ans=(Ans<<1)|ans[i]; cout<<Ans; return 0; }