BZOJ.3668.[NOI2014]起床困难综合症(贪心)

题目链接

每一位是独立的,所以贪心+模拟就行了。
我还以为要判上界啥的(学傻了)。。直接如果某位选1,m减掉它就行了。
要算某个位的0/1通过n扇门的值,直接预处理。

//1116kb	40ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;

char IN[MAXIN],*SS=IN,*TT=IN;

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}

int main()
{
	int n=read(),m=read(),opt0=0,opt1=(1<<29)-1;
	while(n--)
	{
		register char c=gc();for(;!isupper(c);c=gc());
		int x=read();
		switch(c)
		{
			case 'A': opt0&=x, opt1&=x; break;
			case 'O': opt0|=x, opt1|=x; break;
			case 'X': opt0^=x, opt1^=x; break;
		}
	}
	int ans=0;
	for(int i=29; ~i; --i)
		if(opt0>>i&1) ans|=1<<i;
		else if(m>=1<<i && opt1>>i&1) m-=1<<i, ans|=1<<i;
	printf("%d
",ans);

	return 0;
}
原文地址:https://www.cnblogs.com/SovietPower/p/9776589.html