1. 程式人生 > >[BZOJ 3668] 起床困難綜合癥

[BZOJ 3668] 起床困難綜合癥

因此 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] 起床困難綜合癥