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 的回答。

输入输出样例

输入 #1

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

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。

【树状数组】

【思路】

树状数组

【题目大意】

区间反转和单点询问

【题目分析】

区间反转我首先想到了是线段树

用lazy标记某个区间反转过几次

但是我是抱着练习树状数组的目的

来做的这道题

所以必须用树状数组做!!!

不过树状数组该怎么办呢?

难不成枚举每一个点然后修改?

不对

这个时候情不自禁想到了那个优美的东西

差分

类似树状数组模板2的方法

差分一下下就可以很轻松标记翻转次数了

【核心思路】

树状数组维护差分数组

差分数组修改区间

只需要在区间左端点加上修改的值

在右端点之后减去修改的值就好了

求某个位置上的值

就是这个位置之前(包括这个位置)的和

也符合树状数组里面的sum

就不需要做差了

最后按照%2来输出就好了

因为翻转两次之后会回到原来的情况

【思路】

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int Max = 100006;
int a[Max];
int n,m;
int read()
{
int sum = 0,fg = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')fg = -1;
c = getchar();
}
while(c >= '0' && c <= '9')
{
sum = sum * 10 + c - '0';
c = getchar();
}
return sum * fg;
} int lowbit(int x)
{
return x & -x;
} void add(int x,int y)
{
while(x <= n)
{
a[x] += y;
x += lowbit(x);
}
} int sum(int x)
{
int ans = 0;
while(x > 0)
{
ans += a[x];
x -= lowbit(x);
}
return ans;
} signed main()
{
n = read(),m = read();
for(register int i = 1;i <= m;++ i)
{
int t = read();
if(t == 1)
{
int l = read(),r = read();
add(l,1);
add(r + 1,-1);
}
else
{
int qwq = read();
cout << sum(qwq) % 2 << endl;
}
}
return 0;
}

【线段树】

【思路】

线段树

首先感谢@大魔鬼灿灿 巨佬帮我滑鼠标

用树状数组做过了,但是还是可以用线段树做的

所以也拿线段树来做回顾一下线段树,

然后没想到调试了两个小时

【核心思路】

sum记录这个点被修改的次数

因为是区间修改和单点查询

所以线段树中只要不是叶子节点的sum就不需要求了

只用来lazy标记就可以了

然后该下放到叶子节点的时候就下发好了

最后输出记录的修改次数%2

【注意事项】

不管不是叶子节点的sum没问题

但是有的修改的时候却是单点修改

所以该sum++还是得sum++的

把全部节点的sum都当叶子节点的来处理

加上修改的次数

也就是lazy值就好了

【完整代码】

#include<iostream>
#include<cstdio>
#define lson (k << 1)
#define rson (k << 1 | 1) using namespace std; int read()
{
int sum = 0,fg = 1;
char c = getchar();
while(c < '0' || c > '9'){if(c == '-')fg = -1;c = getchar();}
while(c >= '0' && c <= '9'){sum = sum * 10 + c - '0';c = getchar();}
return sum * fg;
}
const int Max = 100004;
struct node
{
int l,r;
int lazy;
int sum;
}a[Max << 2];
int n,m;
int opx,opl,opr; void build(int k,int l,int r)
{
a[k].l = l;a[k].r = r;
if(l == r)
return;
int mid = (l + r) >> 1;
build(lson,l,mid);
build(rson,mid + 1,r);
return;
} void down(int k)
{
if(a[k].lazy)
{
a[lson].sum += a[k].lazy;
a[rson].sum += a[k].lazy;
a[lson].lazy += a[k].lazy;
a[rson].lazy += a[k].lazy;
a[k].lazy = 0;
}
} void change(int k)
{
if(opl <= a[k].l && opr >= a[k].r)
{
a[k].lazy ++;
a[k].sum++;
return;
}
down(k);
int mid = (a[k].l + a[k].r) >> 1;
if(opl <= mid)change(lson);
if(opr > mid)change(rson);
a[k].sum = a[lson].sum + a[rson].sum;
} void query(int k)
{
if(a[k].l == opx && a[k].r == opx)
{
cout << a[k].sum % 2 << endl;
return;
}
down(k);
int mid = (a[k].l + a[k].r) >> 1;
if(opx <= mid) query(lson);
if(opx > mid) query(rson);
} int main()
{
n = read(),m = read();
build(1,1,n);
for(register int i = 1;i <= m;++ i)
{
int qwq = read();
if(qwq == 1)
{
opl = read(),opr = read();
change(1);
}
else
{
opx = read();query(1);
}
}
return 0;
}

洛谷 P5057 [CQOI2006]简单题 题解的更多相关文章

  1. 洛谷 P5057 [CQOI2006]简单题 (树状数组,位运算)

    题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状 ...

  2. 洛谷P5057 [CQOI2006]简单题(线段树)

    题意 题目链接 Sol 紫色的线段树板子题??... #include<iostream> #include<cstdio> #include<cmath> usi ...

  3. [洛谷P5057][CQOI2006]简单题

    题目大意:有一个长度为$n$的$01$串,两个操作: $1\;l\;r:$把区间$[l,r]$翻转($0->1,1->0$) $2\;p:$求第$p$位是什么 题解:维护前缀异或和,树状数 ...

  4. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  5. P5057 [CQOI2006]简单题(线段树)

    果然简单题,5分钟紫题++ 代码 #include <cstdio> #include <algorithm> #include <cstring> using n ...

  6. 洛谷P1072Hankson的趣味题题解

    题目 一道十分经典的数论题,在考场上也可以用暴力的算法来解决,从而得到\(50pts\)的较为可观的分数,而如果想要AC的话,我们观察原题给的数据范围\(a,b,c,d\)(为了好表示,分别代表a1, ...

  7. 【洛谷P4148】简单题(kd-tree)

    传送门 题意: 给出一个\(n*n\)的棋盘,现在有两种操作:一种是某个格子里的数字加上\(A\),另一种是询问矩阵和. 空间限制:\(20MB\),强制在线. 思路: 直接\(kd-tree\)来搞 ...

  8. P5057 [CQOI2006]简单题 前缀异或差分/树状数组

    好思路,好思路... 思路:前缀异或差分 提交:1次 题解:区间修改,单点查询,树状数组,如思路$qwq$ #include<cstdio> #include<iostream> ...

  9. P5057 [CQOI2006]简单题

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

随机推荐

  1. java -jar 时指定内存大小

    java -jar -Xms1024m -Xmx1536m -XX:PermSize=128M -XX:MaxPermSize=256M car.jar 说明: 1.堆内存:最小1024M,最大153 ...

  2. Java学习:Stream流式思想

    Stream流 Java 8 API添加了一种新的机制——Stream(流).Stream和IO流不是一回事. 流式思想:像生产流水线一样,一个操作接一个操作. 使用Stream流的步骤:数据源→转换 ...

  3. docker安装mysql8

    docker run --restart=always -d -v /opt/data/conf.d/:/etc/mysql/conf.d/ -v /opt/data/mysql/:/var/lib/ ...

  4. Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer。。。。。检查一下servlet-api是否冲突了?

    原因:jar包发生冲突.在我的pom.xml文件中 <dependency>      <groupId>javax.servlet</groupId>       ...

  5. RandomAccessFile vs FileChannel.open(path);

    What kind of FileChannel object does the FileChannel.open(path) method return? Is it still random ac ...

  6. [Silverlight 4] Textbox style模擬Textblock 使可以選取、複製

    childwindow 做為訊息視窗,使用textblock,可是textbloc無法選取內容及複製, 就改用textbox假裝成textblock ---原本的textblock <contr ...

  7. C#专业的音视频采集录制类库SharpCapture介绍

    SharpCapture是高性能.轻量级.接口清晰.使用简单的C#语言编写的.NET音视频采集.屏幕录制类库.本类库可以采集系统声卡.麦克风.摄像头.屏幕画面,支持声卡和话筒混音采集. 可以应用到直播 ...

  8. Java中的集合类(List,Set.Map)

    1.List 1.1 Arraylist 与 LinkedList 区别 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 底层数据结构: Arr ...

  9. 关于 Java 关键字 volatile 的总结

    1 什么是 volatile volatile 是 Java 的一个关键字,它提供了一种轻量级的同步机制.相比于重量级锁 synchronized,volatile 更为轻量级,因为它不会引起线程上下 ...

  10. ASCII、Unicode、utf-8、utf-16、utf-32

    理解ASCII.Unicode.utf-8.utf-16.utf-32 目录 理解ASCII.Unicode.utf-8.utf-16.utf-32编码与解码字符集字符编码ASCIIUnicodeUT ...