[NOI2014] 起床困难综合症

水题的题解也水......

原题链接:洛谷 P2114 [NOI2014]起床困难综合症

位运算每一位之间互不干扰。

经过所有门之后每一位不外乎四种结果:一定是0,一定是1,不变或取反。

按位枚举,贪心即可。

对于不变的,我们在限制之内尽可能选更多的1。

其余三种都选0。

代码略显繁杂。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int n,m;
 7 int op[100005];
 8 int b[100005];
 9 int res[35];
10 int fin[35];
11 int ans;
12 
13 int main()
14 {
15     scanf("%d%d",&n,&m);
16     char tp[10];
17     for(int i=1;i<=n;i++)
18     {
19         scanf("%s",tp+1);
20         scanf("%d",&b[i]);
21         if(tp[1]=='A')op[i]=1;
22         if(tp[1]=='O')op[i]=2;
23         if(tp[1]=='X')op[i]=3;
24     }
25     for(int i=0;i<=30;i++)
26     {
27         for(int j=n;j;j--)
28         {
29             int nw=((b[j]>>i)&1);
30             if(op[j]==1)
31             {
32                 if(nw==0){res[i]+=2;break;}
33                 if(nw==1)continue;
34             }
35             if(op[j]==2)
36             {
37                 if(nw==0)continue;
38                 if(nw==1){res[i]=res[i]?2:3;break;}
39             }
40             if(op[j]==3)
41             {
42                 if(nw==0)continue;
43                 if(nw==1)res[i]=(res[i]^1);
44             }
45         }
46     }
47     int fl=0;
48     for(int i=30;i>=0;i--)
49     {
50         int gl=((m>>i)&1);
51         int nw=(res[i]==0);
52         if(fl)fin[i]=nw;
53         if(gl==1&&nw==1)fin[i]=1;
54         if(gl==1&&nw==0)fl=1;
55     }
56     for(int i=0;i<=30;i++)
57     {
58         if(fin[i])ans=ans|(1<<i);
59         if(res[i]%2)ans=ans|(1<<i);
60     }
61     printf("%d",ans);
62     return 0;
63 }
complete code

posted @ 2018-08-14 16:59  cervusky  阅读(255)  评论(2编辑  收藏  举报

Contact with me