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\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...
随机推荐
- Python:鲜为人知的功能特性(上)
GitHub 上有一个名为<What the f*ck Python!>的项目,这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性,并尝试讨论这些 ...
- informix存储过程笔记
一.存储过程概述 存储过程是一个用户定义的函数,由存储过程语句(SPL) 和一组SQL语句组成,以可以执行代码形式存储在数据库中,和表.视图.索引等一样,是数据库的一种对象. 存储过程语言SPL(St ...
- 解决Geoserver请求跨域的几种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景描述 跨域问题是浏览器同源安全制引起的特别常见的问题.不同前端语 ...
- python自定义pi函数的代码
下边内容是关于python自定义pi函数的内容. def pi(): # Compute digits of Pi. # Algorithm due to LGLT Meertens. k, a, b ...
- mpvue学习笔记-之微信小程序数据请求封装
简介 美团出品的mpvue已经开源出来很久了,一直说要进行一次实践,这不最近一次个人小程序开发就用上了它. 看了微信官方的数据请求模块--request,对比了下get和post请求的代码,发现如果在 ...
- IntentService原理分析
IntentService是一个异步处理请求的服务,通过Context#startService(Intent)可以将请求发送给IntentService,IntentService在工作线程中依次串 ...
- 一起学Android之Layout
本文简述在Android开发中布局的简单应用,属于基础知识,仅供学习分享使用. 概述 在Android UI开发中,布局类型主要有两种:LinearLayout(线性布局)和RelativeLayou ...
- Linux(CentOS 7)安装测试mysql5.6服务
1.rpm -qa | grep mysql,查看原系统中是否有已经安装得mysql. 注:centos7系统在安装完成后,未安装mysql任何版本. 2. rpm -e --nodeps mysql ...
- 简单易懂的单元测试框架-gtest(一)
简介 gtest是google开源的一个单元测试框架,以其简单易学的特点被广泛使用.该框架以第三方库的方式插入被测代码中.同其他单元测试框架相似,gtest也通过制作测试样例来进行代码测试.同 ...
- 该用Python还是SQL?4个案例教你节省时间
在数据分析行业,对数据提出的每一个问题都可以用多种潜在的语言和工具包来回答.每种语言都有其优势,它们之间也存在着不同的区别.不能否认的是,有些操作用Python执行起来要比SQL更加高效.这篇文章分享 ...