位运算贪心——BZOJ3668Luogu2114 [Noi2014]起床困难综合症

xiaoxiao2021-02-28  58

题面:Luogu2114 BZOJ3668 既然都是一堆位运算了,我们按位来搞好了 一个很显然的贪心策略,高位选0对接下来选择更有利 所以我们直接按位从高到低贪心,计算这一位是0或1对答案的贡献,如果选1贡献大于0,选1,否则选0 大于m了选0 然后就好了。。。

#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <iostream> #include <ctime> #include <map> #include <queue> #include <cstdlib> #include <string> #include <climits> #include <set> #include <vector> using namespace std; int n,m,ans=0; char c[100001][5]; int q[100001]; inline int check(int x){ for(int i=1;i<=n;i++){ if(c[i][1]=='A')x&=q[i]; if(c[i][1]=='O')x|=q[i]; if(c[i][1]=='X')x^=q[i]; } return x; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%s%d",c[i]+1,&q[i]); for(int i=31;i>=0;i--){ if(ans+(1<<i)>m)continue; int x=check(ans+(1<<i)),y=check(ans); if(x>y)ans+=1<<i; } printf("%d",check(ans)); return 0; }
转载请注明原文地址: https://www.6miu.com/read-52897.html

最新回复(0)