点此看题面

大致题意: 给定一些位运算操作,让你在\(0\sim m\)范围内选一个初始值,使其在经过这些运算后得到的结果最大。

前置技能:关于位运算

作为一道位运算的题,如果你不知道什么是位运算,那就完全做不了了。

关于位运算可以详见这篇博客:位运算相关(一)——位运算学习笔记

接下来,我们还要了解位运算的一个性质:即位运算的各数位之间是互不影响的

根据这个性质,我们就可以得出一个大致思路了。

大致思路

由于位运算时各数位是相互独立的,因此对于各数位,其实只有两种情况:\(0\)或\(1\)。

则我们可以考虑用两个变量\(s1\)和\(s2\),初始化分别为\(0\)和\(-1\)(\(-1\)在二进制下每一位都是\(1\)),分别表示每一位选\(0\)和选\(1\)的情况,来执行完所有操作。

则此时,对于二进制下的某一位,有三种情况:

  • \(s1\)中这一位为\(1\)。说明如果这一位初始值为\(0\)时最终结果为\(1\),则自然选这一位为\(0\)。
  • \(s1\)中这一位为\(0\),但\(s2\)中这一位为\(1\)。说明如果这一位初始值为\(1\)时最终结果为\(0\),则判断当前这位是否能选为\(1\),如果能选,由于二进制数的大小是由高位决定的,因此必选,否则为\(0\)。
  • \(s1\)和\(s2\)中这一位全为\(0\)。则说明这一位无论如何最终结果都为\(0\),则贪心地选其为\(0\)。

按照这样的套路,就能求出答案了。

代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define Gmax(x,y) (x<(y)&&(x=(y)))
#define Gmin(x,y) (x>(y)&&(x=(y)))
#define abs(x) ((x)<0?-(x):(x))
#define swap(x,y) (x^=y^=x^=y)
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define INF 1000000000
using namespace std;
int n,m,s1=0,s2=-1;//用两个变量s1和s2分别表示每一位选0和选1的情况
class Class_FIO
{
private:
#define Fsize 100000
#define tc() (A==B&&(B=(A=Fin)+fread(Fin,1,Fsize,stdin),A==B)?EOF:*A++)
#define pc(ch) (void)(FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
int f,FoutSize,Top;char ch,Fin[Fsize],*A,*B,Fout[Fsize],Stack[Fsize];
public:
Class_FIO() {A=B=Fin;}
inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));x*=f;}
inline void reads(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())&&~ch);}
inline void write(int x) {if(!x) return pc('0');x<0&&(pc('-'),x=-x);while(x) Stack[++Top]=x%10+48,x/=10;while(Top) pc(Stack[Top--]);}
inline void clear() {fwrite(Fout,1,FoutSize,stdout),FoutSize=0;}
}F;
int main()
{
register int i,x,ans=0;register string op;
for(F.read(n),F.read(m),i=1;i<=n;++i)
{
F.reads(op),F.read(x);
switch(op[0])
{
case 'A':s1&=x,s2&=x;break;
case 'O':s1|=x,s2|=x;break;
case 'X':s1^=x,s2^=x;break;
}
}
for(i=30;~i;--i) if(s1&(1<<i)) ans+=1<<i;else if(s2&(1<<i)&&(1<<i)<=m) ans+=1<<i,m-=1<<i;//分类讨论求答案
return F.write(ans),F.clear(),0;
}

【BZOJ3668】[NOI2014] 起床困难综合症(位运算思想)的更多相关文章

  1. [Bzoj3668][Noi2014]起床困难综合症(位运算)

    3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2612  Solved: 1500[Submit][St ...

  2. [P2114] [NOI2014]起床困难综合症 (位运算)

    题面 传送门:https://www.luogu.org/problemnew/show/P2114 Solution 一道很有意思的位运算题. 要做这一题,我们首先得了解一个很重要的特点 位运算过程 ...

  3. 洛谷 P2114 [NOI2014]起床困难综合症 位运算

    题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...

  4. luogu P2114 [NOI2014]起床困难综合症 位运算 二进制

    建议去uoj那里去测,数据比较强 位运算的题目,就得一位一位的分开考虑 然后枚举初始值的最高位是0 是1 的最终攻击 (二进制内)最高位是1肯定比次位是1次次位是1次次次位是1···的大吧,显然 然后 ...

  5. luogu 2114 [NOI2014]起床困难综合症 位运算+贪心

    感觉这个思路非常巧妙啊~ code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s&qu ...

  6. BZOJ-3668 起床困难综合症 位运算+贪心

    faebdc学长杂题选讲中的题目...还是蛮简单的...位运算写的不熟练... 3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec Memory Limit: 512 ...

  7. bzoj3668: [Noi2014]起床困难综合症

    从高位到低位枚举期望的应该是ans最高位尽量取一.如果该数最高位为o的话能够取得1直接更新ans否则判断该位取1是否会爆m不会的话就加上. #include<cstdio> #includ ...

  8. bzoj千题计划238:bzoj3668: [Noi2014]起床困难综合症

    http://www.lydsy.com/JudgeOnline/problem.php?id=3668 这..一位一位的来就好了呀 #include<cstdio> #include&l ...

  9. [bzoj3668][Noi2014][起床困难综合症] (按位贪心)

    Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...

  10. [BZOJ3668] [Noi2014] 起床困难综合症 (贪心)

    Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...

随机推荐

  1. 如何使用ros命令行显示图片

    rosrun image_view image_view image:=[TOPIC] 注意:每次只能显示一个UI.不能在一条命令中订阅多个节点.

  2. struts2学习笔记——第一个struts2应用配置

    说实在的,随着Java学习的不断深入,特别是Java web框架部分,调bug让人很心累,但是每征服一个bug,内心的成就感也是难以言说的.第一个struts2应用的配置,我昨天折腾了快2个小时,最后 ...

  3. 清北刷题冲刺 11-03 a.m

    纸牌 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  4. 2017-10-24 NOIP模拟赛

    括号序列 (bracket) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法 ...

  5. 洛谷P1311 选择客栈

    P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...

  6. 初识Scrapy之再续火影情缘

    前言Scrapy框架之初窥门径1 Scrapy简介2 Scrapy安装3 Scrapy基础31 创建项目32 Shell分析4 Scrapy程序编写41 Spiders程序测试42 Items编写43 ...

  7. java资料

     HTML5+CSS3视频教程:http://pan.baidu.com/s/1hsyOjze   密码:c3uw JavaScript视频教程:链接:http://pan.baidu.com/s/1 ...

  8. LCS(Longest Common Subsequence)

    http://blog.csdn.net/zztfj/article/details/6157429 LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题 ...

  9. Day3上

    T1 星空[问题描述]你是能看到第一题的friends 呢.——hja点点星空是一张

  10. Hibernate数据库的操作

    参考网址: https://www.cnblogs.com/jack1995/p/6952704.html 1.最简单的查询 List<Special> specials = (List& ...