今天状态真的是不一般的差。
LCT动态维护最大生成树没调出来,费用流又没写出来。
结果这道煞笔贪心都要重构一次代码才能A
--------------
然后做法其实很简单,逆向枚举每一个位,判断当前位经过一连串的运算后能否为1。当前位的值分0和1两种情况。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; char ss[10]; int main() { int n,m,x; scanf("%d%d",&n,&m); int A=0,B=(1<<30)-1; for(int i=1;i<=n;i++) { scanf("%s%d",ss+1,&x); if(ss[1]==‘A‘) A&=x, B&=x; if(ss[1]==‘O‘) A|=x, B|=x; if(ss[1]==‘X‘) A^=x, B^=x; } int now=0,ans=0; for(int i=30;i>=0;i--) { int k=(1<<i); bool a=(A&k),b=(B&k); if(a==false&&b==false)continue; else if(a==true)ans+=k; else if(now+k<=m)now+=k,ans+=k; } printf("%d\n",ans); return 0; }