分析
由于每一位之间的计算是独立的
并且最后选择每个位上的数时
一定是贪心取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;
} 
京公网安备 11010502036488号