起床困难综合症 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;
}
起床困难综合症

 

posted @ 2018-05-31 15:40  shzr  阅读(238)  评论(0编辑  收藏  举报