问题 C: 与非

时间限制: 2 Sec  内存限制: 256 MB
提交: 54  解决: 34
[提交][状态][讨论版]

题目描述

作为一名新世纪共产主义的接班人,你认识到了资本主义的软弱性与妥协性,决定全面根除资本主义,跑步迈入共产主义。但是当你即将跨入共产主义大门的时候,遇到了万恶的资本家留下的与非电路封印,经过千辛万苦的研究,你终于把复杂的破解转变成了以下问题:

初始时你有一个空序列,之后有N个操作。

操作分为一下两种:

1 x:在序列末尾插入一个元素x(x=0或1)。

2 L R:定义nand[L,R]为序列第L个元素到第R个元素的与非和,询问nand[L,L]^nand[L,L+1]^nand[L,L+2]^......^nand[L,R]。

Nand就是先与,再取反

输入

从文件nand.in中读入数据。

输入第一行一个正整数N,表示操作个数。

接下来N行表示N个操作。

为了体现程序的在线性,记lastans为上一次操作二的回答,初始lastans=0,。对于操作1,你需要对x异或lastans。对于操作二,设现在序列中的元素个数为M,如果lastans=1,那么你需要作如下操作:L=M-L+1,R=M-R+1,swap(L,R)

输出

输出到nand.out中。

输出有多行。为对于每一个操作二的回答。

样例输入

61 11 11 02 1 22 1 32 2 3

样例输出

100

提示

【数据规模和约定】

数据点 N的规模 操作一的个数M1 操作二的个数M2

1 N<=1000 M1<=500 M2<=500

2 N<=1000 M1<=500 M2<=500

3 N<=200000 M1<=100000 M2<=100000

4 N<=200000 M1<=100000 M2<=100000

5 N<=1000000 M1<=900000 M2<=100000

6       N<=4000000    M1<=3900000 M2<=100000
7       N<=4000000    M1<=3900000 M2<=100000
8       N<=4000000    M1<=3900000 M2<=100000
9       N<=4000000    M1<=3900000 M2<=100000
10     N<=4000000    M1<=3900000 M2<=100000
对于所有数据,满足N<=4000000,M1<=3900000,M2<=100000,x={0,1},L<=R。
第一眼,wc 题我都没看懂  ,这么弱赶紧滚粗吧 = = 
第二眼,哈哈,看懂了(其实 老师做了解释)   = =
第三眼,数据结构,不过貌似不可做啊                = =

第四眼,还是看有没有什么 一颗赛艇  的性质吧 = =

最后,爆零    = =  ,性质找错了   好尴尬   是我太弱了

题解:*@***#**@*   什么真值表,线段树,都去死吧  。 。 。

神一般的做法:

要求的是[L,R] 区间内的值,考虑到异或具有可减性,我们可以用sum[r]-sum[l-1] 来求得

可减性 : 1^1^0^0^1^1^0^1^0 ==1

1^1^0^0 ==0

求 1^1^0^1^0 =(1^1^0^0^1^1^0^1^0)^(1^1^0^0) ==1

原因:连续的1,0异或结果只与1个数的奇偶性有关,奇则为1,偶则为0.(不信试一试)

Then 易得nand[i,j]=!(nand[i,j-1]&val[j])

设f[i] 表示nand[1,i] , sum[i]=f[1]^f[2]^……^f[n]。

考虑 两个式子 !(val[l]&val[l+1])  !(f[l]&val[l+1])

若 val[l]==f[l] 则再往后 结果都一样 所以 ans=sum[r]^sum[l-1]

若 val[l]! =f[l] 则一个为1,另一个为0 再往后 若 val[i] ==1 则两个值 又1—>0,0—>1;

一直保持不同,但一旦遇到0,二者均变为1 再往后则一直保持一致,我们需要考虑

在连续的 1—>0,0—>1过程中两个式子出现一的次数是否一致,

若一致 ans=sum[r]^sum[l-1], 若不一致 ans=sum[r]^sum[l-1]^1

接下来考虑如何统计1的个数,设从l往后第一个0的下标为pos,则之前两式交替出现0,1的次数即为pos-l

若(pos-l)%2==0 则两式出现一的次数相等 ans=ans=sum[r]^sum[l-1];

若(pos-l)%2==1 无论谁多一个1,谁少一个1,秩序再^1即可, ans=ans=sum[r]^sum[l-1]^1;

第一个0的下标可以用链表在读入时求得,O(1)即可得到其下标。链表具体实现过程留给读者思考(代码)

总之,这道题很考思维,代码量却很小,很不错。

最后%一发大佬lc

代码如下:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int M=4000000+10;
int n,ans,cnt,p;
int pre[M],nxt[M];
bool sum[M],f[M],val[M];
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9')   {if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
}
int main(){n=read();for(int i=1;i<=n;i++){int opt,l,r;opt=read();if(opt==1){l=read()^ans;val[++cnt]=l;if(!val[cnt]){nxt[p]=cnt;p=cnt;}else pre[cnt]=p;if(cnt==1)f[1]=sum[1]=val[cnt];else{f[cnt]=!(f[cnt-1]&val[cnt]);sum[cnt]=sum[cnt-1]^f[cnt];}}else{l=read();r=read();if(ans==1){l=cnt-l+1;r=cnt-r+1;swap(l,r);}if(l==r)          {printf("%d\n",ans=(int)val[l]);continue;}if(val[l]==f[l])  {printf("%d\n",ans=sum[r]^sum[l-1]);continue;}else{int pos=nxt[pre[l]];if(val[l]==0) pos=nxt[l];pos=min(pos-1,r);int pd=pos-l+1;if(pd&1)     {printf("%d\n",ans=sum[r]^sum[l-1]^1);continue;}else         {printf("%d\n",ans=sum[r]^sum[l-1]);continue;}}}}return 0;
}

暑假集训 T3 与非相关推荐

  1. 暑假集训考试反思+其它乱写

    7.20 Sat 下午返校 回来改题 sdfz的巨佬觉得线上虐人不够爽,所以他们过来了 改T2的时候发现一个问题 如果要用$i$和$i\ xor\ 1$表示相邻的两条边,链式前向星tot初值必须设为1 ...

  2. 2016暑假集训总结

    Preface 这是蒟蒻lyd729在初二升初三的暑假里训练的总结. 来看看一年前的lyd729写的暑假集训总结(链接),真是觉得自己长大了好多. 这一年发生了太多故事.(我来讲故事啦) 去年,一升初 ...

  3. 【2021软件创新实验室暑假集训】SpringMVC框架(设计原理、简单使用、源码探究)

    系列文章目录 20级 Java篇 [2021软件创新实验室暑假集训]计算机的起源与大致原理 [2021软件创新实验室暑假集训]Java基础(一) [2021软件创新实验室暑假集训]Java基础(二) ...

  4. 暑假集训后的一些感想

    在开学一个星期后我终于还是写下了这篇有关暑假集训博客,暑假集训的开始时间是七月十八号,是放暑假后的第三个星期.也就是说刚放假时我们还都回家了两个星期,快乐的玩耍了一阵子.随着时间的推移,时间来到七月十 ...

  5. ACM暑假集训总结(2014年夏)

    ACM暑假集训总结 这篇总结本来是打算暑假集训结束后, UVa上刷够300题, 给这一路留个纪念, 可最后竟然给了自己个大耳光--298. Hehe. 既然打算写了,那该干的就得干. 一个耳光没打够, ...

  6. 2016暑假集训小结

    小结 暑假集训之前,有很多事情在忙,什么考试,**之类.集训开始的时候还回了一趟家,这趟回家也发生了对我影响最大的事,之后想了很久,觉得也还是有必要继续走下去,因为我还是很爱这个集训队,很爱思考题解题 ...

  7. 2015暑假集训总结

    这个暑假,我很明显的感觉,我的许多方面都发现了缺陷或得到了提升. 首先是做比赛.做题策略方面的,我还有很多要改进的地方.比赛时,我总是想到一些有些神奇的想法,有时会接近正解或者就是,有时会相差甚远,打 ...

  8. 2014暑假集训总结

    为期五个星期的暑假集训就这么结束了,如果说寒假的集训是为我们挖了一个个大坑,那么暑假的集训就只能说是宇宙大爆炸了.到了现在才发现,寒假我们学习的东西仅仅只是皮毛而已,这次学习的高级数据结构,真的是把我 ...

  9. 2019暑假集训感触与收获

    记得我们的集训开始时间是8.19,然后我提前了两天过来了学校,想着为充实的集训先做点准备...没想到的是在饥饿中度过了漫长的48小时(旁边的食堂木有开门,懒得走辣么远还是自己太懒了),还好两天也挺快, ...

最新文章

  1. 户外生活--西湖林至千军台
  2. qt creator无法删除文件怎么办?(需要在cmakelists文件里配置)
  3. Objective-C中深拷贝与浅拷贝简述
  4. 【报告分享】2022跨境电商行业趋势报告.pdf(附下载链接)
  5. mediacodec延时_FFmpeg优化点播延时方案
  6. 热修复 阿里的AndFix
  7. 手把手教你搭建Android开发环境
  8. 编程珠玑java_编程珠玑第八章
  9. Word自动目录中包含公式如何去掉?
  10. 广告中的CPM、CPC、CPA解释
  11. 爬虫,酷我音乐接口解析
  12. 联想计算机不识别硬盘分区,联想笔记本进PE不识别硬盘
  13. 微信支付的架构到底有多牛?
  14. 用.Net Core接入微信公众号开发
  15. 针对文件流转Base64的操作
  16. 基于多智能体模型的街道步行空间量化研究
  17. 国微大学php,国微CMS学校网站系统(学校版) v20191205
  18. flink 并行度。
  19. windows系统有线连接网络,再连入wify后,优先使用wify
  20. 魔兽插件修改服务器名字,《私人定制》如何制作自己心仪的插件

热门文章

  1. 什么是主从复制?mysql主从复制?redis主从复制?
  2. VC++中unhandled exception的处理
  3. 基于深度学习的遥感测绘行业解决方案
  4. 安装Fedora(附镜像下载地址)
  5. 客户端与服务端的区别
  6. 2019年蓝桥杯C/C++ B组试题 部分题目答案
  7. python英文单词
  8. 九十年代 计算机课,九十年代的计算机体系结构
  9. Simpoint - 0x1 切片完整步骤
  10. 如何辨别数清冲突域和广播域