[NOI2014]魔法森林 二分答案

来源:互联网 发布:外婆的澎湖湾 知乎 编辑:程序博客网 时间:2024/06/08 18:06

简单题吧
二进制各个位置是独立的
所以可以一位一位贪心来做
爆枚每一位是0还是1,然后O(n)验证
时间代价O(Nlog2M)

#include <bits/stdc++.h>#define N 200050using namespace std;inline int rd() {    int x=0,f=1;char ch=getchar();    while (ch>'9'||ch<'0') {if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}    return x*f;}struct Dat{int _,t;}Q[N];int n,m,t;char s[10];int check(int x) {    for (int i=1;i<=n;i++) {        Q[i]._==1? x&=Q[i].t :0;        Q[i]._==2? x|=Q[i].t :0;        Q[i]._==3? x^=Q[i].t :0;    }    return x;}int main() {    n = rd(), m = rd();    for (int i=1;i<=n;i++) {        scanf("%s%d",s+1,&t);        if (s[1] == 'A') Q[i] = (Dat){1,t};        if (s[1] == 'O') Q[i] = (Dat){2,t};        if (s[1] == 'X') Q[i] = (Dat){3,t};    }    int ans = 0;    for (int i=30;i>=0;i--) {        int na = ans + (1<<i);        if (na > m) continue;        if (check(na) > check(ans)) ans = na;    }    cout << check(ans) << endl;    return 0;}
原创粉丝点击