NOI2014 起床困难综合症
3668: [Noi2014]起床困难综合症
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 225 Solved: 153
[Submit][Status]
Description
Input
第1行包含2个整数,依次为n,m,表示drd有n扇防御门,atm的初始攻击力为0到m之间的整数。接下来n行,依次表示每一扇防御门。每行包括一个字符串op和一个非负整数t,两者由一个空格隔开,且op在前,t在后,op表示该防御门所对应的操作, t表示对应的参数。
Output
一行一个整数,表示atm的一次攻击最多使 drd 受到多少伤害。
Sample Input
AND 5
OR 6
XOR 7
Sample Output
HINT
【样例说明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<=10^9
0<=t<=10^9
一定为OR,XOR,AND 中的一种
【运算解释】
在本题中,选手需要先将数字变换为二进制后再进行计算。如果操作的两个数二进制长度不同,则在前补0至相同长度。
OR为按位或运算,处理两个长度相同的二进制数,两个相应的二进制位中只要有一个为1,则该位的结果值为1,否则为0。XOR为按位异或运算,对等长二进制模式或二进制数的每一位执行逻辑异或操作。如果两个相应的二进制位不同(相异),则该位的结果值为1,否则该位为0。 AND 为按位与运算,处理两个长度相同的二进制数,两个相应的二进制位都为1,该位的结果值才为1,否则为0。
例如,我们将十进制数5与十进制数3分别进行OR,XOR 与 AND 运算,可以得到如下结果:
0101 (十进制 5) 0101 (十进制 5) 0101 (十进制 5)
OR 0011 (十进制 3) XOR 0011 (十进制 3) AND 0011 (十进制 3)
= 0111 (十进制 7) = 0110 (十进制 6) = 0001 (十进制 1)
Source
题解:
发现了一个比较好的性质,如果有一位or 1了就一定为1,所以不论之前的取值,如果有一位and 0了就一定为0
这样就只用考虑剩下的位了
考场上竟然sb的去枚举每一位(for i=1 to 1《《tot-1 do)。。。心里还想如果数据是随机的话,肯定需要枚举的位数不多。。。我太天真了。。。
其实想到这儿已经接近正解了,考虑到每一位互不影响,所以我们只单独枚举每一位,其他位都是0,来做一遍,看看能否为0,接下来就是sb贪心了
具体实现的时候,可以先用0做一遍,这样在枚举32位的时候,如果0得到的答案中这一位已经为1,那就不用考虑了,直接将这一位用0即可
代码:
1.考场80分(我还写了那么多小程序。。。)
var n,m,ans,x,y:int64;
i,j,tot,mark:longint;
a,b:array[..] of int64;
c:array[..] of boolean;
d:array[..] of int64;
ch:char;
flag:boolean;
procedure init;
begin
readln(n,m);
for i:= to n do
begin
read(ch);if ch='A' then b[i]:= else if ch='O' then b[i]:= else b[i]:=;
while ch<>' ' do read(ch);
readln(a[i]);
if (b[i]=) and (a[i]=) then begin flag:=true;mark:=i;end;
end;
end;
procedure work1;
begin
ans:=;
for j:= to m do
begin
x:=j;
for i:= to n do if b[i]= then x:=x and a[i] else if b[i]= then x:=x or a[i] else x:=x xor a[i];
if x>ans then ans:=x;
end;
writeln(ans);
end;
procedure work2;
begin
x:=;
for i:=mark+ to n do if b[i]= then x:=x and a[i] else if b[i]= then x:=x or a[i] else x:=x xor a[i];
writeln(x);
end;
procedure work4;
begin
x:=;
for i:= to tot do inc(x,<<(d[i]-));
for i:= to n do if b[i]= then x:=x and a[i] else if b[i]= then x:=x or a[i] else x:=x xor a[i];
ans:=x;
for j:= to do
begin
x:=random(m+);
for i:= to n do if b[i]= then x:=x and a[i] else if b[i]= then x:=x or a[i] else x:=x xor a[i];
if x>ans then ans:=x;
end;
writeln(ans);
end;
procedure work3;
begin
fillchar(c,sizeof(c),false);
for i:= to n do
if b[i]= then
for j:= to do if (a[i] and (<<(j-))<>) then c[j]:=true;
for i:= to n do
if b[i]= then
for j:= to do if (a[i] and (<<(j-))=) then c[j]:=true;
tot:=;
for i:= to do if not(c[i]) then begin inc(tot);d[tot]:=i;end;
y:=trunc(ln(m)/ln())+;
while d[tot]>y do dec(tot);
if (<<tot)*n> then begin work4;exit;end;
for i:= to <<tot- do
begin
x:=;
for j:= to tot do
if i and (<<(j-))<> then inc(x,<<(d[j]-));
if x>m then continue;
for j:= to n do if b[j]= then x:=x and a[j] else if b[j]= then x:=x or a[j] else x:=x xor a[j];
if x>ans then ans:=x;
end;
writeln(ans);
end;
begin
assign(input,'sleep.in');assign(output,'sleep.out');
reset(input);rewrite(output);
ans:=;
flag:=false;
init;
if n*m< then work1 else if flag then work2 else work3;
close(input);close(output);
end.
2.正解100分
var n,m,ans,x,y,z,cnt:int64;
i,j,mark:longint;
a,b:array[..] of int64;
c:array[..] of boolean;
ch:char;
flag:boolean;
procedure init;
begin
readln(n,m);
for i:= to n do
begin
read(ch);if ch='A' then b[i]:= else if ch='O' then b[i]:= else b[i]:=;
while ch<>' ' do read(ch);
readln(a[i]);
if (b[i]=) and (a[i]=) then begin flag:=true;mark:=i;end;
end;
end;
procedure work2;
begin
x:=;
for i:=mark+ to n do if b[i]= then x:=x and a[i] else if b[i]= then x:=x or a[i] else x:=x xor a[i];
writeln(x);
end;
procedure work1;
begin
x:=;
for i:= to n do if b[i]= then x:=x and a[i] else if b[i]= then x:=x or a[i] else x:=x xor a[i];
z:=x;ans:=x;cnt:=;
fillchar(c,sizeof(c),false);
for i:= downto do
if z and (<<(i-))= then
begin
x:=<<(i-);
for j:= to n do if b[j]= then x:=x and a[j] else if b[j]= then x:=x or a[j] else x:=x xor a[j];
if (x and (<<(i-))<>) and (cnt+<<(i-)<=m) then begin c[i]:=true;inc(cnt,<<(i-));end;
end;
for i:= to do if c[i] then inc(ans,<<(i-));
writeln(ans);
end;
begin
assign(input,'sleep.in');assign(output,'sleep.out');
reset(input);rewrite(output);
ans:=;
flag:=false;
init;
if flag then work2 else work1;
close(input);close(output);
end.
NOI2014 起床困难综合症的更多相关文章
- bzoj3668: [Noi2014]起床困难综合症
从高位到低位枚举期望的应该是ans最高位尽量取一.如果该数最高位为o的话能够取得1直接更新ans否则判断该位取1是否会爆m不会的话就加上. #include<cstdio> #includ ...
- BZOJ 3668: [Noi2014]起床困难综合症( 贪心 )
之前以为xor,or,and满足结合律...然后连样例都过不了 早上上体育课的时候突然想出来了...直接处理每一位是1,0的最后结果, 然后从高位到低位贪心就可以了... 滚去吃饭了.. ------ ...
- BZOJ 3668: [Noi2014]起床困难综合症【贪心】
3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1305[Submit][St ...
- Luogu 睡觉困难综合征 ([NOI2014]起床困难综合症)
一.[NOI2014]起床困难综合症 题目描述 网址:https://daniu.luogu.org/problemnew/show/2114 大意: 有一条链,链上每一个节点包含一个位运算f 与 一 ...
- P2114 [NOI2014]起床困难综合症(二进制)
P2114 [NOI2014]起床困难综合症 我们开始设俩数,一个二进制表示全是1,另一个全是0(就是2147483647 和 0 辣) 蓝后跑一遍门 于是最后有4种情况 1->0,1-> ...
- 洛谷P2114 [NOI2014]起床困难综合症
P2114 [NOI2014]起床困难综合症 题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作 ...
- bzoj千题计划238:bzoj3668: [Noi2014]起床困难综合症
http://www.lydsy.com/JudgeOnline/problem.php?id=3668 这..一位一位的来就好了呀 #include<cstdio> #include&l ...
- [NOI2014]起床困难综合症(二进制+贪心)
题目 [NOI2014]起床困难综合症 做法 先用全\(0\)和全\(1\)去运行一下,再在满足\(m\)的限制下,贪心地从高位到低位选择即可
- 3668: [Noi2014]起床困难综合症
3668: [Noi2014]起床困难综合症 https://www.lydsy.com/JudgeOnline/problem.php?id=3668 分析: 每一位分开考虑. 算出每一位为1,计算 ...
随机推荐
- Java多线程-线程的锁总结
一.多线程-同步函数的锁是this /*同步函数用的是哪一个锁呢?函数需要被对象调用.那么函数都有一个所属对象引用.就是this.所以同步函数使用的锁是this. 通过该程序进行验证. 使用两个线程来 ...
- IO流04_InputStream和Reader输入流
[输入流中的字符流和字节流] [InputStream和Reader] InputStream和Reader是所有输入流的抽象基类,本身不能实例化,但是他们是所有输入流的模板. [ InputStre ...
- 01_SpringMVC流程架构图
[组件说明] 以下组件通常使用框架提供实现: 1.DisPatcherServlet:前端控制器(不需要程序员开发) 用户请求到达前端控制器,它相当于MVC模式中的C(Controller),Disp ...
- ubuntu16.04无法连接无线的问题解决方式以及QQ的安装
0x01 首先我是安装了win10与ubuntu16.04的双系统,不过遇到的问题有启动项与无线连接的问题,今天说一下联网的问题. 连接宽带是正常的,只需要操作sudo pppoeconf 这条命令即 ...
- iPad知识点记录
这两天玩了玩虚拟机安装Mac OS系统.iPad1的越狱以及利用iTunes将iPad2的系统升级到iOS8.1,这里将一些参考资源以及关键点记录一下. 一.虚拟机安装Mac OS 首先你的系统要能够 ...
- Html5页面返回机制解决方案
需要处理的返回场景: 1.正常的a->b->c 2.页面上的按钮触发需要登陆 3.页面跳转需要登陆 4.页面上的可修改的部分(如选择地址,地址页面本身也是可以增删改查的) 整体的原则是原路 ...
- Python的传值和传址与copy和deepcopy
1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会 ...
- Hibernate各种主键生成策略2
先来看看主键映射的标签: <id (1)name="propertyName" (2)column="column_name" (3)type=& ...
- unity3d游戏开发(一)——圈圈叉叉
参考:http://game.ceeger.com/forum/read.php?tid=1719 ———————————————————开始————————————— 好吧,吹了那么多我们开始吧,先 ...
- javascript高级编程笔记02(基本概念)
ParseInt()函数: 由于Number函数在转换字符串时比较复杂而且不合理,我们常常转换字符串都用parseInt函数, Parseint函数规则: 忽略字符串前面的空格,直到找到第一个非空格字 ...