[BZOJ 3668] 起床困難綜合癥
阿新 • • 發佈:2018-07-01
因此 bzoj pri ora lan names turn AS clas
Link:
BZOJ 3668 傳送門
Solution:
怎麽回事啊,難道好好學貪心就能在NOI上切題了?
位運算相關題型的思路:
由於位運算以位為單位,因此每一位一般都是獨立的,分別統計即可
因此對於此題我們對每一位都進行貪心策略:
1、如果該位在$m$之內,只要能最終變為1就計算貢獻
2、如果該位已經超過$m$,則只有當能從0變為1時才計算貢獻
Code:
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; char op[MAXN][5]; int n,m,k,dat[MAXN],mx,res=0; int solve(int pos,int S) { int ret=S<<pos; for(int i=1;i<=n;i++) if(op[i][0]==‘A‘) ret&=(dat[i]&(1<<pos)); else if(op[i][0]==‘X‘) ret^=(dat[i]&(1<<pos)); else ret|=(dat[i]&(1<<pos)); return ret; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%s%d",op[i],&dat[i]),mx=max(mx,dat[i]); for(k=0;(1<<k)<=m;k++) if(solve(k,1)||solve(k,0)) res+=(1<<k); for(;(1<<k)<=mx;k++) if(solve(k,0)) res+=(1<<k); printf("%d",res);return 0; }
[BZOJ 3668] 起床困難綜合癥