P5057 [CQOI2006]简单题
题目描述
有一个 n 个元素的数组,每个元素初始均为 0。有 m 条指令,要么让其中一段连续序列数字反转——0 变 1,1 变 0(操作 1),要么询问某个元素的值(操作 2)。 例如当 n = 20 时,10 条指令如下:

输入输出格式
输入格式:
第一行包含两个整数 n, m,表示数组的长度和指令的条数; 以下 m 行,每行的第一个数 t 表示操作的种类:
若 t = 1,则接下来有两个数 L, R,表示区间 [L, R] 的每个数均反转; 若 t = 2,则接下来只有一个数 i,表示询问的下标。
输出格式:
每个操作 2 输出一行(非 0 即 1),表示每次操作 2 的回答。
输入输出样例
20 10
1 1 10
2 6
2 12
1 5 12
2 6
2 15
1 6 16
1 11 17
2 12
2 6
1
0
0
0
1
1
说明
对于 50% 的数据,1 ≤ n ≤ 10^3, 1 ≤ m ≤ 10^4; 对于 100% 的数据,1 ≤ n ≤ 10^5, 1 ≤ m ≤ 5 × 10^5,保证 L ≤ R。
线段树的区间修改,单点查询,似乎并不用建树,建树好像还有问题
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
int xxoo[maxn];
int n,m,L,R,opt,x;
void pushdown(int now)
{
if(xxoo[now])
{
xxoo[now*]^=;
xxoo[now*+]^=;
xxoo[now]=;
}
}
void modify(int now,int l,int r,int stdl,int stdr)
{
if(stdl>=l&&stdr<=r)
{
xxoo[now]^=;
return;
}
pushdown(now);
int mid=(stdl+stdr)>>;
if(l<=mid)
{
modify(now<<,l,r,stdl,mid);
}
if(r>mid)
{
modify(now<<|,l,r,mid+,stdr);
}
}
int query(int now,int x,int stdl,int stdr)
{
if(stdl==stdr)
{
return xxoo[now];
}
pushdown(now);
int mid=(stdl+stdr)>>;
if(x<=mid)
{
return query(now<<,x,stdl,mid);
}
else
{
return query(now<<|,x,mid+,stdr);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&opt);
if(opt==)
{
scanf("%d%d",&L,&R);
modify(,L,R,,n);
}
else
{
scanf("%d",&x);
printf("%d\n",query(,x,,n));
}
}
return ;
}
错误代码(多了一个建树)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
struct node
{
int l;
int r;
int lazyxor;
int value;
int sum;
}tree[maxn*];
int n,m,L,R,opt,x;
void build(int now,int l,int r)
{
tree[now].l=l;
tree[now].r=r;
tree[now].lazyxor=;
if(l==r)
{
tree[now].value=tree[now].sum=;
return;
}
int mid=(l+r)>>;
build(now<<,l,mid);
build(now<<|,mid+,r);
tree[now].sum=tree[now*].sum+tree[now*+].sum;
}
void pushdown(int now)
{
if(tree[now].lazyxor)
{
tree[now*].lazyxor^=;
tree[now*+].lazyxor^=;
tree[now].lazyxor=;
}
}
void modify(int now,int l,int r)
{
if(tree[now].l>=l&&tree[now].r<=r)
{
tree[now].lazyxor^=;
return;
}
pushdown(now);
int mid=(tree[now].l+tree[now].r)>>;
if(l<=mid)
{
modify(now<<,l,mid);
}
if(r>mid)
{
modify(now<<|,mid+,r);
}
}
int query(int now,int x,int l,int r)
{
if(tree[now].l==tree[now].r)
{
return tree[now].lazyxor;
}
pushdown(now);
int mid=(tree[now].l+tree[now].r)>>;
if(x<=mid)
{
return query(now*,x,l,r);
}
else
{
return query(now*+,x,l,r);
}
}
int main()
{
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<=m;i++)
{
scanf("%d",&opt);
if(opt==)
{
scanf("%d%d",&L,&R);
modify(,L,R);
}
else
{
scanf("%d",&x);
printf("%d\n",query(,x,,n));
}
}
return ;
}
P5057 [CQOI2006]简单题的更多相关文章
- 洛谷 P5057 [CQOI2006]简单题 题解
P5057 [CQOI2006]简单题 题目描述 有一个 n 个元素的数组,每个元素初始均为 0.有 m 条指令,要么让其中一段连续序列数字反转--0 变 1,1 变 0(操作 1),要么询问某个元素 ...
- P5057 [CQOI2006]简单题(线段树)
果然简单题,5分钟紫题++ 代码 #include <cstdio> #include <algorithm> #include <cstring> using n ...
- 洛谷P5057 [CQOI2006]简单题(线段树)
题意 题目链接 Sol 紫色的线段树板子题??... #include<iostream> #include<cstdio> #include<cmath> usi ...
- 洛谷 P5057 [CQOI2006]简单题(树状数组)
嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...
- 洛谷 P5057 [CQOI2006]简单题 (树状数组,位运算)
题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状 ...
- [洛谷P5057][CQOI2006]简单题
题目大意:有一个长度为$n$的$01$串,两个操作: $1\;l\;r:$把区间$[l,r]$翻转($0->1,1->0$) $2\;p:$求第$p$位是什么 题解:维护前缀异或和,树状数 ...
- P5057 [CQOI2006]简单题 前缀异或差分/树状数组
好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...
- P5057 【[CQOI2006]简单题】
洛谷P5057[CQOI2006]简单题 差分 树状数组基本操作不说了,主要想记录一下异或下的差分 a数组为每一位的真实值(假设\(a[0]=0\)),t为差分后的数组 则\(t[i]=a[i]\)^ ...
- 「CQOI2006」简单题 线段树
「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...
随机推荐
- pycharm安装svn插件
弄了svn的服务端和客户端,为了方便我pycharm的使用,我又在pycharm里进行了配置,要用到subversion 下载 https://sourceforge.net/projects/win ...
- Asp.Net Core 轻松学-项目目录和文件作用介绍
前言 上一章介绍了 Asp.Net Core 的前世今生,并创建了一个控制台项目编译并运行成功,本章的内容介绍 .NETCore 的各种常用命令.Asp.Net Core MVC 项目文件目录 ...
- 从零开始搭建Prometheus自动监控报警系统
从零搭建Prometheus监控报警系统 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开 ...
- 搞懂Redis到底快在哪里
前言 Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可以由String,hash,list,set,zset,Bitmaps,HyperLogLog等多种数 ...
- cocos creator主程入门教程(七)—— MVC架构
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇将介绍在游戏客户端常用的架构MVC架构.一个游戏的MVC如下划分: M:1)单例全局的数据中心Wo ...
- 【资料总结】| Deep Reinforcement Learning 深度强化学习
在机器学习中,我们经常会分类为有监督学习和无监督学习,但是尝尝会忽略一个重要的分支,强化学习.有监督学习和无监督学习非常好去区分,学习的目标,有无标签等都是区分标准.如果说监督学习的目标是预测,那么强 ...
- Kafka学习资料
博客系列: Apache Kafka简介Apache Kafka安装和使用Apache Kafka核心概念kafka核心组件和流程—控制器kafka核心组件和流程—协调器kafka核心组件和流程—日志 ...
- JVM的总结
1.JVM的内存模型 JVM主要由程序计数器,虚拟机栈,堆,方法区,本地方法区 1.程序计数器的功能是记录当前线程执行到了字节码文件的哪一行, JVM执行的是.java编译后的.class文件 2.虚 ...
- DataTable增加行
- 使用Boostrap框架写一个登录\注册界面
Bootstrap是一个Web前端开发框架,使用它提供的css.js文件可以简单.方便地美化HTML控件.一般情况下,对控件的美化需要我们自己编写css代码,并通过标签选择器.类选择器.ID选择器为指 ...