BZOJ 3668 [Noi2014]起床困难综合症
题解:贪心,从高位到低位考虑这一位到底是1还是0
O(nlogn)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100009;
int n,m;
int ans;
int a[maxn];
int op[maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
char s[10];
scanf("%s",s);
scanf("%d",&a[i]);
if(s[0]=='A'){
op[i]=1;
}
if(s[0]=='O'){
op[i]=2;
}
if(s[0]=='X'){
op[i]=3;
}
}
for(int j=30;j>=1;--j){
int b1=0,b2=1;
for(int i=1;i<=n;++i){
if(op[i]==1){
if(a[i]&(1<<(j-1))){
b1&=1;b2&=1;
}else{
b1&=0;b2&=0;
}
}
if(op[i]==2){
if(a[i]&(1<<(j-1))){
b1|=1;b2|=1;
}else{
b1|=0;b2|=0;
}
}
if(op[i]==3){
if(a[i]&(1<<(j-1))){
b1^=1;b2^=1;
}else{
b1^=0;b2^=0;
}
}
}
if(b1&&b2){
ans+=(1<<(j-1));
}else if(b1){
ans+=(1<<(j-1));
}else if(b2){
if(m>=(1<<(j-1))){
m-=(1<<(j-1));
ans+=(1<<(j-1));
}else{
}
}else{
}
}
printf("%d\n",ans);
return 0;
}
致歉:笔者已经意识到这是一篇几乎没有价值的文章,给您的阅读带来不好的体验,并且干扰了您的搜索环境,非常抱歉!

浙公网安备 33010602011771号