生活随笔
收集整理的这篇文章主要介绍了
[codevs3311]起床困难综合症
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
题目←
wwq:这题你居然没一眼切?!
嗯……二进制枚举……
判断不超过m的二进制数的每一位是1更优还是0更优
显然同时满足我们要放0
为了便于判断大小,从高位到低位枚举
复杂度 2*n*log(m)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
const LL MAXN =
100000 +
50;
LL n,m;
struct zt
{LL ch,num;
}ope[MAXN];
string x;
LL len;
LL ans;
LL check(LL loc,LL v)
{
if(v)v <<= loc;
for(LL i =
1;i <= n;i ++){
if(ope[i].ch ==
1){
if((ope[i].num & v) ==
0)v =
0;}
else if(ope[i].ch ==
2){
if(ope[i].num & (
1 << loc))v = (
1 << loc);}
else if(ope[i].ch ==
3){
if(ope[i].num & (
1 << loc))
if(v)v =
0;
else v = (
1 << loc);}}
return v;
}
LL now,maxn;
int main()
{
scanf(
"%lld%lld",&n,&m);
for(LL i =
1;i <= n;i ++){
cin >> x;
if(x ==
"AND"){ope[i].ch =
1;}
else if(x ==
"OR"){ope[i].ch =
2;}
else if(x ==
"XOR"){ope[i].ch =
3;}
scanf(
"%d",&ope[i].num);maxn = max(maxn,ope[i].num);}len = log2(maxn);
for(LL i = len;i >=
0;i --){LL tmp1 = check(i,
1);LL tmp2 = check(i,
0);
if(now + (
1 << i) > m || tmp2 >= tmp1){ans += tmp2;}
else if(tmp1 > tmp2){ans += tmp1;now += (
1 << i);}}
printf(
"%lld",ans);
}
总结
以上是生活随笔为你收集整理的[codevs3311]起床困难综合症的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。