一点疑问
查看原帖
一点疑问
304550
black_trees楼主2021/11/13 23:34

RT,我Code里面的 limit ,如果是 30,2930,29 就可以过。

但是 31,3231,32 就会 WA #6

2828 就会 WA #2,10

不是很理解为什么,求看看 /kel


#include<bits/stdc++.h>
using namespace std;

#define int long long
#define rep(x,l,r) for(register int (x)=(l);(x)<=(r);++(x))
#define per(x,r,l) for(register int (x)=(r);(x)>=(l);--(x))
const int si=1e5+10;
struct node{
    int op,val;  
}a[si];
int n,m,limit;
int ret=0,ans=0;
inline int calc(int pos,int msk){  
    rep(i,1,n){
        if(a[i].op==0) msk=msk&(a[i].val>>pos&1);
        if(a[i].op==1) msk=msk|(a[i].val>>pos&1);
        if(a[i].op==2) msk=msk^(a[i].val>>pos&1);
    } return msk;
}

signed main(){
    scanf("%lld%lld",&n,&m),limit=30; 
    // 30 or 29 -> AC
    // 31 or 32 ->WA #6
    // 28 -> WA #2,10
    rep(i,1,n){ string s;
        cin>>s,scanf("%lld",&a[i].val);
        if(s[0]=='A') a[i].op=0;
        if(s[0]=='O') a[i].op=1;
        if(s[0]=='X') a[i].op=2;
    } 
    per(i,limit,0){
        int a=calc(i,0),b=calc(i,1);
        if(ret+(1<<i)<=m && a<b) ret+=(1<<i),ans+=(b<<i); 
        else ans+=(a<<i); 
    } return printf("%lld\n",ans),0;
}

2021/11/13 23:34
加载中...