洛谷P3870 [TJOI2009] 开关 (线段树)
简单的省选题......
打异或标记即可。
1 #include<bits/stdc++.h>
2 const int N=2e5+10;
3 using namespace std;
4 int n,m,a,b,c;
5 struct node{
6 int l,r,num,lazy;
7 }t[N<<2];
8 int read(){
9 int x=0,f=1;char c=getchar();
10 while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
11 while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
12 return x*f;
13 }
14
15 void pushup(int k){
16 t[k].num=t[k<<1].num+t[k<<1|1].num;
17 }
18
19 void pushdown(int k){
20 if(t[k].lazy){
21 t[k<<1].num=t[k<<1].r-t[k<<1].l+1-t[k<<1].num;
22 t[k<<1|1].num=t[k<<1|1].r-t[k<<1|1].l+1-t[k<<1|1].num;
23 t[k<<1].lazy^=1;
24 t[k<<1|1].lazy^=1;
25 t[k].lazy=0;
26 }
27 }
28
29 void build(int k,int l,int r){
30 t[k].l=l,t[k].r=r;
31 if(l==r) return ;
32 int mid=(l+r)>>1;
33 build(k<<1,l,mid);build(k<<1|1,mid+1,r);
34 }
35
36 void change(int k,int l,int r){
37 if(t[k].l>=l && t[k].r<=r){
38 t[k].lazy^=1;
39 t[k].num=t[k].r-t[k].l+1-t[k].num;
40 return ;
41 }
42 pushdown(k);
43 int mid=(t[k].l+t[k].r)>>1;
44 if(l<=mid) change(k<<1,l,r);
45 if(r>mid) change(k<<1|1,l,r);
46 pushup(k);
47 }
48
49 int query(int k,int l,int r){
50 if(t[k].l>=l && t[k].r<=r) return t[k].num;
51 pushdown(k);
52 int ans=0;
53 int mid=(t[k].l+t[k].r)>>1;
54 if(l<=mid) ans+=query(k<<1,l,r);
55 if(r>mid) ans+=query(k<<1|1,l,r);
56 return ans;
57 }
58
59 int main(){
60 n=read(),m=read();
61 build(1,1,n);
62 while(m--){
63 c=read(),a=read(),b=read();
64 if(c==0) change(1,a,b);
65 else cout<<query(1,a,b)<<endl;
66 }
67 }
洛谷P3870 [TJOI2009] 开关 (线段树)的更多相关文章
- 洛谷P3870 [TJOI2009]开关
题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种: ...
- 洛谷 P3870 [TJOI2009]开关
题意简述 有n盏灯,默认为关,有两个操作: 1.改变l~r的灯的状态(把开着的灯关上,关着的灯打开) 2.查询l~r开着的灯的数量 题解思路 维护一个线段树,支持区间修改,区间查询 懒标记每次^1 代 ...
- 洛谷 P3870 [TJOI2009]开关 题解
原题链接 前置知识: 线段树的单点.区间的修改与查询. 一看,我们需要维护两个操作: 区间取反: 区间求和. (因为区间 \(1\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区 ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- 洛谷P5111 zhtobu3232的线段树
题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...
- 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay
正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...
随机推荐
- 初学者入门:使用WordPress搭建一个专属自己的博客
体验简介 阿里云云起实验室提供相关实验资源,点击前往 场景将提供一台基础环境为CentOS 的ECS(云服务器)实例,这台服务器上已经内置LAMP环境.我们将会在这台服务器上安装 WordPress ...
- 将Nginx配置成系统开机启动服务
# 如何将nginx配置成我们的系统服务 # 1.在/usr/lib/systemd/system目录下面配置nginx.service内容 # 如果想要详细了解制作的过程:https://blog. ...
- Java中break、continue和return三者之间的区别
控制流程语句 java关键字break.continue.return主要按三个纬度去区分. 作用不同 结束不同 紧跟不同 一.作用不同 1.break:执行break操作,跳出所在的当前整个循环, ...
- placeholder 设置字体颜色
input::-webkit-input-placeholder { /* WebKit browsers */ color: #999; } input:-moz-placeholder { col ...
- BMP位图之代码实现
从16位开始,不存在调色板,顶多存在一个RGBQUAD的掩码. 16位位图,我没有拿到对应的素材,但是根据官方文档的描述和代码验证后,我总结为下: 当biCompression为BI_RGB时,此时是 ...
- ebook下载 | 《 企业高管IT战略指南——企业为何要落地DevOps》
"当下,企业DevOps转型不仅是IT部门的事情,更是企业高管必须关注的焦点.DevOps是一项需要自上而下推动的变革运动,只有从顶层实施,才能获得成功.本书将介绍企业高管必须了解的,Dev ...
- 美女 Committer 手把手教你使用海豚调度
还在为选哪个调度发愁么?还在为查使用手册愁眉不展么?来来来,先瞧一眼海豚调度的 Slogan:调度选的好,下班回家早.调度用的对,半夜安心睡.为充分贯彻这一宗旨,海豚调度一条龙服务来了,特地邀请海豚社 ...
- 使用idea remote 开发体验
本地使用idea开发最不好的一个体验就是打开稍大的工程就非常的卡,怎么调参数都没用,现在idea推出了idea remote就赶紧来体验下. 使用方式 除了idea不需要额外下载什么包,但是因为rem ...
- linux 旁路掉协议栈的处理点
对于协议栈的发展,目前有三种处理趋势,一种是类似于使用dpdk的方式,然后将协议栈放到用户态来做,做得比较好的一般都是以bsd的协议栈为底子,可以参考的是腾讯开源的的方案,另外一种是,继续放在内核,但 ...
- MySQL查询关键数据方法
MySQL查询关键数据方法 操作表的SQL语句补充 1.修改表名 alter table 表名 reame 新表名: 2.新增字段名 alter table 表名 add 字段名 字段类型(数字) 约 ...