【某集训题解】【DAY 2 T3】与非
题目描述
作为一名新世纪共产主义的接班人,你认识到了资本主义的软弱性与妥协性,决定全面根除资本主义,跑步迈入共产主义。但是当你即将跨入共产主义大门的时候,遇到了万恶的资本家留下的与非电路封印,经过千辛万苦的研究,你终于把复杂的破解转变成了以下问题:
初始时你有一个空序列,之后有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中。
输出有多行。为对于每一个操作二的回答。
样例输入
6
1 1
1 1
1 0
2 1 2
2 1 3
2 2 3
样例输出
1
0
0
提示
【数据规模和约定】
数据点 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
题解:
据说正解是什么线段树(?)反正我跑得快233。
其实不是很难,推一下式子就好了。
Nand[ i ,j ]定义同题面。那么nand[i,j]=!(nand[ I , j-1 ]&a[ j ]) =。。。(!a[ I ]& a [ i+1])&…….
F[ I ]表示nand[ 1,I ]。F[ j ]= ……!((! F[i-1]&a [i ])&a[ i+1 ])……Sum[ i] =f[1]^…^f[I ]观察上下两式。F[j]与nand[ I ,J ]结果与!(a[ I ]& a [ i+1])和!((! F[i-1]&a [i ])&a[ i+1 ]))有关。分类讨论一下,当A[I+1 ]==0时,两式结果相等,当A[I+1 ]==1时,那么仅在(A[ I ]==1&&F[I-1]==1)||(A[I]==0)时对答案可能产生影响。前者使这一层变成0与1,后者使这一层变成1与0 。
(具体不太好写,我在下面写一下式子)
当A[ I ]==1&&F[I-1]==1/(A[I]==0时可以自己画一下)
|
假设到A[I+X]之前A[I+?]都是1 |
&A[I+1] 然后! |
&A[I+2] |
&A[I+3] |
&A[I+4] |
&A[I+5] |
… |
&A[I+X] |
|
a[ I ] |
0 |
1 |
0 |
1 |
0 |
… |
1 |
|
! F[i-1]&a [i ] |
1 |
0 |
1 |
0 |
1 |
… |
1 |
这也就意味着在F[I+X]之前F[I+y]与nand[I,I+Y]一直是相反的,所以他们的区间异或和仅与X的奇偶性有关(大家可以自己推一下)。从I+X到R,F数组的结果一直与nand[I,I+X+…]相等,这也就意味着这之后的F异或和与nand相等,所以这部分我们可以用F数组的答案来代替nand。再考虑前面F与nand不相等的部分。已经说过这部分异或和仅与X的奇偶性有关。
最终答案就是sum[R]^sum[L-1]^1(x为奇数)sum[R]^sum[L-1](x为偶数)。对于查单点要特判233。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N=;
inline int read(){
int s=,k=;char ch=getchar();
while(ch<''||ch>'') k=ch=='-'?-:k,ch=getchar();
while(ch>=''&&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
}
int n,m;
bool ans;
bool f[N],a[N];
bool sum[N];
int main(){
n=read();
for(int i=,op,x,l,r;i<=n;i++){
op=read();
if(op==){
x=read()^ans;
m++;
a[m]=x;
if(m==) f[m]=x;
else f[m]=-(f[m-]&x);
sum[m]=sum[m-]^f[m];
}
else{
l=read(),r=read();
if(ans==){
l=m-l+,r=m-r+; swap(l,r);
}
ans=a[l];
int j=l;
bool s=-(a[l]&a[l+]);
while(s!=f[j+]&&j<r){
ans^=s;
j++;
s=-(s&a[j+]);
}
if(j<r){
ans^=sum[r]^sum[j];
}
printf("%d\n",ans);
}
}
}
【注】:其实在查询【L,R】第一个0出现位置应用二分查或者链表,但题目数据太水,就直接暴力咯。
链表版(不是自己打的,懒,而且实测居然比暴力慢233):
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int M=+;
int n,ans,cnt,p;
int pre[M],nxt[M],sum[M],f[M],val[M];
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>'') {if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='') {x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;
}
int main(){
n=read();
for(int i=;i<=n;i++){
int opt,l,r;
opt=read();
if(opt==){
//cout<<opt<<endl;
val[++cnt]=read();
val[cnt]^=ans;
if(!val[cnt]){
nxt[p]=cnt;
p=cnt;
}else pre[cnt]=p;
if(cnt==)
f[]=sum[]=val[cnt];
else{
f[cnt]=!(f[cnt-]&val[cnt]);
sum[cnt]=sum[cnt-]^f[cnt];
}
}else{
//cout<<opt<<endl;
l=read();r=read();
if(ans==){
l=cnt-l+;r=cnt-r+;
swap(l,r);
}
if(l==r) { printf("%d\n",ans=val[l]);continue;}
if(val[l]==f[l]) {printf("%d\n",ans=sum[r]^sum[l-]);continue;}
else{
int pos=nxt[pre[l]];
if(val[l]==) pos=nxt[l];
pos=min(pos,r+);
int pd=pos-l;
if(pd&) {printf("%d\n",ans=sum[r]^sum[l-]^);continue;}
else {printf("%d\n",ans=sum[r]^sum[l-]);continue;}
}
//printf("%d\n",sum[r]^sum[l-1]);continue;
}
}
// while(1);
return ;
}
【某集训题解】【DAY 2 T3】与非的更多相关文章
- 2021-06-27 & 2021-06-28 集训题解
西克 题目传送门 Description Solution 跟 2021年省选A卷D2T1 一模一样,懒得讲了 不过这个题似乎有点卡空间,所以卡不过去 Code #include <bits/s ...
- 十二省联考题解 - JLOI2019 题解
十二省联考题解 - JLOI2019 题解 两个T3的难度较大 平均代码量远大于去年省选 套路题考查居多 A 难度等级 1 $n^2$暴力可以拿到$60$分的优秀成绩 然后可以想到把区间异或转化为前缀 ...
- 牛客网NOIP赛前集训营-提高组(第一场)
牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...
- 【题解】[Ghd]
[题解]Ghd 一道概率非酋题? 题目很有意思,要我们选出大于\(\frac{n}{2}\)个数字使得他们的最大公约数最大. 那么我们若随便选择一个数字,他在答案的集合里的概率就大于\(0.5\)了. ...
- BZOJ2453: 维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 183 Solved: 89[Submit][Status] Descripti ...
- Redis持久存储-AOF&RDB
Redis中数据存储模式有2种:cache-only,persistence;cache-only即只做为"缓存"服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在&qu ...
- [NOI赛前训练]——专项测试3·数学
由于并不想写T1和T2的题解……所有只有T3的题解了. T3 由于内部题就只写题解了. 好吧,我是一点都不想写…… 说一下这zz题解哪里写错了吧…… ……不想写…… 就说一个吧…… $n-\frac{ ...
- NOI导刊 2018河南郑州游记
前言 本蒟蒻来自浙江的弱市弱校,因为不想两年\(OI\)一场空,以及想出去玩,所以与同届大佬一起报了\(NOI\)导刊,希望能留下点不错的记忆吧. \(Day\ 0\) \(10\)月\(1\)日 经 ...
- 我是怎么从安卓到php再成为前端开发工程师的
记得我下定决心学Android(安卓)是17年的暑假,暑假前,学校组织了一次集训,美其名曰帮我们巩固知识,实际上就是学校和长沙的培训学校某牛达成了合作,教我们一些基础知识,然后集训完建议那些在学校没学 ...
随机推荐
- 探索Windows命令行系列(2):命令行工具入门
1.理论基础 1.1.命令行的前世今生 1.2.命令执行规则 1.3.使用命令历史 2.使用入门 2.1.启动和关闭命令行 2.2.执行简单的命令 2.3.命令行执行程序使用技巧 3.总结 1.理论基 ...
- HDFS Java API的使用举例
HDFS是Hadoop应用程序使用的主要分布式存储.HDFS集群主要由管理文件系统元数据的NameNode和存储实际数据的DataNodes组成,HDFS架构图描述了NameNode,DataNode ...
- Unity 游戏框架搭建 (五) 简易消息机制
什么是消息机制? 23333333,让我先笑一会. 为什么用消息机制? 三个字,解!!!!耦!!!!合!!!!. 我的框架中的消息机制用例: 1.接收者 ``` using UnityEngine ...
- JVM入门——运行时数据区
这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课.其中的“堆”和“虚拟机栈(栈)”更是耳熟能详.下面将围绕这张图对JVM的运行时数据区做一个简单介绍. 程序计数器(Pro ...
- MySQL常用基本命令
启动MySQL /etc/init.d/mysqld start 优雅的关闭数据库的方法 1:使用MySQLadmin mysqladmin -uroot -p123456 shutdown 2:使用 ...
- php中curl的使用(一)
cURL 是一个利用URL语法规定来传输文件和数据的工具,PHP的curl是通过libcurl库与服务器使用各种类型的协议,如HTTP.FTP.TELNET等. PHP curl函数 curl_clo ...
- RunLoop的简单理解笔记
一句话解释RunLoop:运行任务的循环. 为什么要有RunLoop:解决交互式UI设计中的一个问题,如何快速响应用户输入,如何快速将程序运行结果输出到屏幕? 基本原理:1 将任务分解的足够细 2 每 ...
- CSS 回流(reflow)
摘录: 1. 回流 回流是指浏览器为了重新渲染部分或者全部的文档而重新计算文档中元素的位置和几何构造的过程. 因为回流可能导致整个dom树的重新构造,所以会影响性能. 2. display:no ...
- Java的基本数据类型和运算
编码 ASCII--0~127 65-A 97-a 西欧码表---ISO-8859-1---0-255---1个字节 gb2312----0-65535---gbk---2个字节 Unicode编 ...
- CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)
CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...