我也得了起床综合困难症…啊啊啊
好了,停,还是直接开始吧
先放题目链接:

https://www.luogu.com.cn/problem/P2114

题目描述

21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳。作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争。通过研究相关文献,他找到了该病的发病原因: 在深邃的太平洋海底中,出现了一条名为drd的巨龙,它掌握着睡眠之精髓,能随意延长大家的睡眠时间。 正是由于drd的活动,起床困难综合症愈演愈烈, 以惊人的速度在世界上传播。为了彻底消灭这种病,atm决定前往海底,消灭这条恶龙。历经千辛万苦,atm终于来到了drd所在的地方,准备与其展开艰苦卓绝的战斗。drd有着十分特殊的技能,他的防御战线能够使用一定的运算来改变他受到的伤害。具体说来,drd的防御战线由n扇防御门组成。每扇防御门包括一个运算op和一个参数t,其中运算一定是OR,XOR,AND中的一种,参数则一定为非负整数。如果还未通过防御门时攻击力为x,则其通过这扇防御门后攻击力将变为x op t。最终drd受到的伤害为对方初始攻击力x依次经过所有n扇防御门后转变得到的攻击力。
由于atm水平有限,他的初始攻击力只能为0到m之间的一个整数(即他的初始攻击力只能在 0, 1, … , m中任选,但在通过防御门之后的攻击力不受m的限制)。为了节省体力,他希望通过选择合适的初始攻击力使得他的攻击能让drd受到最大的伤害,请你帮他计算一下,他的一次攻击最多能使drd受到多少伤害。
输入输出格式
输入格式:
输入文件的第 1 行包含 2 个整数,依次为n, m,表示 drd 有n扇防御门,atm 的初始攻击力为0到m之间的整数。
接下来n行,依次表示每一扇防御门。每行包括一个字符串op和一个非负整数t,两者由一个空格隔开,且op在前,t在后,op表示该防御门所对应的操作,t表示对应的参数。
输出格式:
输出一行一个整数,表示atm的一次攻击最多使drd受到多少伤害。
输入输出样例
输入样例#1:
3 10
AND 5
OR 6
XOR 7
输出样例#1:
1
说明
【样例说明】
atm可以选择的初始攻击力为 0,1, … ,10。
假设初始攻击力为 4,最终攻击力经过了如下计算
4 AND 5 = 4
4 OR 6 = 6
6 XOR 7 = 1
类似的,我们可以计算出初始攻击力为 1,3,5,7,9 时最终攻击力为 0,初始攻击力为 0,2,4,6,8,10 时最终攻击力为 1,因此atm的一次攻击最多使drd受到的伤害值为1。
【数据规模与约定】

初步思路

暴力解决,枚举0~m,大家都挺喜欢超时的哈哈哈

思考:位运算的特征

我们知道,在计算机里数字按二进制存储,也就是一个数的每一位不是0就是1,当0、1进行相同次序的位运算以后得出来的也是0、1。

m<=10^9,即m的位数不超过30位。

我们需要最后进行位运算以后的答案最大,也就是说,从最高位开始到最低位,我们要让每一位尽可能为1。

例如,我们有3位,从第三位开始,我们让第三位为1,即100,值为4,如果第三位为0,值为0;
第二位为1,得到110,值为6,010值为2,000值为0;

总结一下就是,当一个数的第i位经过一系列位运算为1时,对答案的贡献就是1<<i;
当一个数的第i位经过一系列位运算为0时,对答案没有贡献。

那么,我们考虑当一个数的第i位经过一系列位运算为1时的情况:
情况1.第i位数原来是0,经过一系列位运算变成1;
情况2.第i位数原来是1,经过一系列位运算变成1;

对于情况1:如果第i位原来是0,后来变成了1,0~m的二进制中,可以任意实现第i位是0,所以答案直接计算加上贡献值1<<i;
对于情况2:第i位数原来是1,经过一系列位运算变成1,然而,对于这种情况,必须是i小于m是1的最高位,因为大于m是1的最高位就超出了m的范围;
例如5,转换为二进制是101,那么i<=3;
转换一下,也就是说,这个条件是:(1>>i)的值小于m;
这里要注意,计算完以后要让m的这一位变成0,即101,变成001,不然当i=2时,也小于m=5,判断错误。

那么我们只需要对30位全是0,和30位全是1,即a0=0,二进制为000000…,a1=-1,二进制为11111…,来进行一系列的位运算。
然后根据位运算后是1的情况来进行对最后答案的计算。

代码如下:

#include<bits/stdc++.h>
using namespace std;int a1=0,a2=-1;
int ans=0;int main()
{int n,m;cin>>n>>m;for(int i=1;i<=n;++i){char str[5];scanf("%s",str);int x; cin>>x;if(str[0]=='A')           a1&=x,a2&=x;else if(str[0]=='O')  a1|=x,a2|=x;else if(str[0]=='X')  a1^=x,a2^=x;}for(int j=29;j>=0;--j){if((a1>>j)&1)  ans+=(1<<j);//第i位原来是0else if((a2>>j)&1&&(1<<j)<m)    ans+=(1<<j),m-=(1<<j);//第i位原来是1}printf("%d\n",ans);return 0;
} 

这次的位运算学习,就到今天结束了。
这一次复盘位运算又学到了很多东西,位运算真的是十分巧妙有趣的东西,还需要通过反复实践琢磨。
明天开始第二部分的递推与递归,希望打败了巨龙的我不再起床困难了。

最后,放一个小总结:
1.位运算的关键是二进制0、1的问题
2.0、1可以用来表示多种情况,选与不选
3.利用二进制+位运算可以有效地降低时间复杂度。

下次位运算,再会啦。

起床综合困难症(位运算)相关推荐

  1. CH - 0104 起床困难综合症(位运算+贪心)

    题目链接:点击查看 题目大意:我们需要构造一个初始值start,范围在[0,m],要求使用这个初始值进行k次操作后得到的答案最大,每次操作分为三个类型: AND x:让当前答案与x进行按位与 OR x ...

  2. 起床困难综合征(位运算)

    具体说来,drd 的防御战线由 nn 扇防御门组成.每扇防御门包括一个运算 opop 和一个参数 tt,其中运算一定是 OR,XOR,AND 中的一种,参数则一定为非负整数.如果还未通过防御门时攻击力 ...

  3. 【NOI2014】起床困难综合症 位运算+贪心

    这道题先求出0和-1经过处理后的答案 具体看代码吧 #include<cstdio> #include<cstring> #include<algorithm> u ...

  4. 0x01.基本算法 — 位运算

    目录 一.位运算 二.memset函数 三.移位运算 四.二进制状态压缩 五.成对变换 六.lowbit 七.相关习题 0.AcWing 26. 二进制中1的个数 1.Acwing 89. a^b(快 ...

  5. 起床困难综合症(0x01位运算)

    起床困难综合症 题意 drd 的防御战线由 n 扇防御门组成. 每扇防御门包括一个运算 op 和一个参数 t,其中运算一定是 OR,XOR,AND 中的一种,参数则一定为非负整数. 如果还未通过防御门 ...

  6. 位运算 起床困难综合症

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

  7. CH0104 起床困难综合症(位运算典例)

    传送门:起床困难综合症 思路:要知道位运算永远只会改变本位,与其它位泾渭分明.据此,我们不难看出,每个位仅有1.0两种状态,在全部运算后,寻找两种状态的最大结果即可. #include<cstr ...

  8. 起床困难综合症(位运算)

    题目链接 AcWing 998. 题意:最初攻击力不知道,给定m次位运算操作,计算经过m次位运算操作后的最大值. 思路:在代码顶部 混合位运算不具有分配律,交换律,结合律 // 存在多个不同的位运算符 ...

  9. 【位运算】起床困难综合症(包含错误思路点拨)

    原题 解题思路一(错误): 顺着做(每个数用数组存)的思路是人脑思路,但是电脑会TLE.我们可以反着来. 大概的思路就是先假设一个最终结果的最大值. 然后问电脑:这数运算回去(按照输入的门的顺序,逆着 ...

  10. P3613 睡觉困难综合征(LCT + 位运算)

    题意 NOI2014 起床困难综合症 放在树上,加上单点修改与链上查询. 题解 类似于原题,我们只需要求出 \(0\) 和 \(2^{k - 1} - 1\) 走过这条链会变成什么值,就能确定每一位为 ...

最新文章

  1. What is acceptable cell and suitable cell in LTE?
  2. 顺子对百录收录的看法
  3. Android Handler原理
  4. 横向ListView(四) —— 添加滚动条
  5. 久坐的危害和解决方式
  6. MySQL教程(一)—— 数据库设计
  7. 了不起!靠技术脱贫,他们只用了短短两年!
  8. “编程能力差,90%输在了数学上!”骨灰级开发:其实你们都是瞎努力!
  9. 文件不混淆_Python代码保护 | pyc 混淆从入门到工具实现
  10. 中高级PHP程序员应该掌握哪些技术
  11. 【转】SQL SERVER2005版本介绍
  12. 双系统ubuntu无法进入_win10下安装ubuntu双系统
  13. Linux完全卸载mysql数据库
  14. Android数据库大批量数据插入优化
  15. VMware虚拟机下载及Ubuntu安装指南
  16. java支付宝网页授权_轻松实现支付宝服务窗网页授权从配置到获取授权获取用户信息...
  17. 基于股票大数据分析的Python入门实战(实践记录)(持续更新)
  18. c语言内部函数与,内函数和外函数关系 有关C语言的内部函数和外部函数的定义说明...
  19. JavaApi:IO基础
  20. 增加点赞手势图及提交按钮图标

热门文章

  1. MFC调用RDP实现远程桌面共享实例
  2. springboot 实现自动屏蔽敏感词过滤器
  3. 读书笔记(一)——《许三观卖血记》
  4. 统计碱基数目、GC含量、read数、最长的read、最短的read及平均read长度
  5. Maya2018安装报错:visual c++ 2010 sp1 错误代码1612
  6. 论文笔记:Composable Sparse Fine-Tuning for Cross-Lingual Transfer
  7. 项目报错-Some file crunching failed, see logs for details
  8. HTML中怎么创建表单,如何在HTML中创建表单
  9. Python 生成微信头图
  10. 为什么Web前端薪资如此高呢?总结了这4个原因