BZOJ3668 [NOI2014] 起床困难综合症
2015-12-10 14:35
239 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3668
历经千辛万苦,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 受到多少伤害。
AND 5
OR 6
XOR 7
PoPoQQQ神犇的题解:/article/2352033.html 不多说了……
View Code
Description
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 受到多少伤害。
Input
第1行包含2个整数,依次为n,m,表示drd有n扇防御门,atm的初始攻击力为0到m之间的整数。接下来n行,依次表示每一扇防御门。每行包括一个字符串op和一个非负整数t,两者由一个空格隔开,且op在前,t在后,op表示该防御门所对应的操作, t表示对应的参数。Output
一行一个整数,表示atm的一次攻击最多使 drd 受到多少伤害。Sample Input
3 10AND 5
OR 6
XOR 7
Sample Output
1PoPoQQQ神犇的题解:/article/2352033.html 不多说了……
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define rep(i,l,r) for(int i=l; i<=r; i++) #define clr(x,y) memset(x,y,sizeof(x)) using namespace std; const int maxn = 100010; int n,m,ans=0,f[31],fun[maxn],num[maxn]; char op[3]; inline int read(){ int ans = 0, f = 1; char c = getchar(); while (!isdigit(c)){ if (c == '-') f = -1; c = getchar(); } while (isdigit(c)){ ans = ans * 10 + c - '0'; c = getchar(); } return ans * f; } inline int calc(int x){ rep(i,1,n) if (fun[i] == 1) x &= num[i]; else if (fun[i] == 2) x |= num[i]; else x ^= num[i]; return x; } int main(){ n = read(); m = read(); rep(i,1,n){ scanf("%c",op); if (op[0] == 'A') fun[i] = 1; else if (op[0] == 'O') fun[i] = 2; else fun[i] = 3; num[i] = read(); } int t = calc(0); rep(i,0,30) f[i] = calc(1 << i) & (1 << i); for(int i=30; i>=0; i--){ if (t & (1 << i)) continue; if (ans + (1 << i) <= m && f[i]) ans += (1 << i); } printf("%d\n",calc(ans)); return 0; }
View Code
相关文章推荐
- 需要交互的shell编程——EOF(转载)
- js--在页面元素上(移动到或获取焦点)、鼠标离开(或失去焦点)
- OCP-1Z0-051-2015-50题
- windows下 BurpSuite pro安装
- Code人心弦(高级组)
- Android 的设置项 II-Reading Settings&Custom Preference
- Minitab软件下载与培训文档
- C# 通过Hook的方法 屏蔽快捷键
- Gradle入门安装
- 剑指offer系列之二十九:连续子数组的最大和
- leetcode:242 Valid Anagram-每日编程第八题
- Ubuntu 安装 wireshark
- PMBOX 五大过程组合9个知识体系
- 翻硬币问题(还没看
- BZOJ 1406: [AHOI2007]密码箱( 数论 )
- 无法向会话状态服务器发出会话状态请求
- Windows10 UWP Back Button的处理
- SqlSever锁及存储过程优化
- 浏览器-02 Chromium的多线程
- meizu手机的虚拟键盘被popwindow覆盖的解决办法