分析
由于每一位之间的计算是独立的
并且最后选择每个位上的数时
一定是贪心取0而后取1
所以我们可以对于每一位取1或0进行操作
但这样的话复杂度比较高
我们直接考虑用一个全1的二进制数(-1)和全0的二进制数(0)进行所有操作
最后贪心取0或1即可
时间复杂度:
期望得分:100分
温馨提示:注意细节,需要判到32位,不然只有90。。。
代码
//P2114 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define LL long long #define Cl(X,Y) memset((X),(Y),sizeof(X)) #define FOR(i,A,B) for(LL i=A;i<=B;i++) #define BOR(i,A,B) for(LL i=A;i>=B;i--) #define De(X) cerr<<#X<<" = "<<X<<endl #define Lowbit(X) (X & (-X)) #define Skip cout<<endl; #define INF 0x3f3f3f3f3f3f3f3f #define Mod 998244353 #define Rson (X<<1|1) #define Lson (X<<1) using namespace std; LL Limit,Total; LL A=-1,B=0,Val; char Opt[5]; inline void File() { freopen(".in","r",stdin); freopen(".out","w",stdout); } signed main() { // File(); // ios::sync_with_stdio(false); scanf("%lld %lld",&Total,&Limit); FOR(i,1,Total) { scanf("%s",Opt+1); scanf("%lld",&Val); if(Opt[1]=='A') { A &= Val; B &= Val; } else if(Opt[1]=='O') { A |= Val; B |= Val; } else { A ^= Val; B ^= Val; } } LL Temp=0,Ans=0; BOR(i,32,0) { if((B>>i) & 1ll) { Ans+=(1ll<<i); } else if((A>>i) & 1ll) { if(Temp+(1ll<<i)<=Limit) { Ans+=(1ll<<i); Temp+=(1ll<<i); } } } printf("%lld\n",Ans); // fclose(stdin); // fclose(stdout); system("pause"); return 0; }