洛谷 P3870 [TJOI2009]开关 题解
前置知识:
线段树的单点、区间的修改与查询。
一看,我们需要维护两个操作:
区间取反;
区间求和。
(因为区间 \(1\) 的个数,就是区间的和)
典型的 线段树 。
如果你只会线段树的 区间修改,单点修改,区间查询,单点查询 的话,这题的 “取反” 是个难题。
但是,这个数组有个性质:
\(a_i \in {0,1}\)
也就是说,假设一个数组一开始这样子:
\(1\) | \(2\) | \(3\) | \(4\) | |
---|---|---|---|---|
\(a_i\) | \(0\) | \(1\) | \(0\) | \(0\) |
\(b_i\) | \(1\) | \(0\) | \(1\) | \(1\) |
翻转过后,你会发现:
翻转后的区间和 = 区间长度 - 区间和。
因为 原来的区间和 是 \(1\) 的个数,减掉 \(1\) 的个数就是 \(0\) 的个数,而 \(0\) 翻转后就是 \(1\),会对答案产生贡献。
下面区间翻转的标记叠加怎么办?
显然,翻转 偶数 次直接变成 \(0\),因为等于没有翻转;翻转 奇数 次变成 \(1\),因为等于翻转 \(1\) 次。
那么,每次翻转在标记上 异或 一下就行。
(异或之后,\(0 \gets 1\),\(1 \gets 0\))
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
#define L (i<<1)
#define R (i<<1)+1
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
struct tree{
int l,r,sumi;
int tag;
};
tree t[N<<2];
int n,m;
inline void update(int i) {
t[i].sumi=t[L].sumi+t[R].sumi;
}
inline void build_tree(int i,int l,int r) {
t[i].l=l; t[i].r=r; t[i].tag=0; t[i].sumi=0;
if(l==r) return; int mid=(l+r)>>1;
build_tree(L,l,mid);
build_tree(R,mid+1,r);
} //建树
inline void pushdown(int i) {
int x=t[i].tag; if(!x) return;
t[L].sumi=t[L].r-t[L].l+1-t[L].sumi;
t[R].sumi=t[R].r-t[R].l+1-t[R].sumi;
t[L].tag^=1; t[R].tag^=1; t[i].tag=0;
} //下传标记
inline void change(int i,int l,int r) {
if(l<=t[i].l && t[i].r<=r) {
t[i].sumi=t[i].r-t[i].l+1-t[i].sumi;
t[i].tag^=1; return;
} pushdown(i); int mid=(t[i].l+t[i].r)>>1;
if(l<=mid) change(L,l,r);
if(r>mid) change(R,l,r);;
update(i);
} //区间修改
inline int query(int i,int l,int r) {
if(l<=t[i].l && t[i].r<=r) return t[i].sumi;
pushdown(i); int mid=(t[i].l+t[i].r)>>1,ans=0;
if(l<=mid) ans+=query(L,l,r);
if(r>mid) ans+=query(R,l,r);
return ans;
} //区间询问
int main(){
n=read(); m=read();
build_tree(1,1,n);
while(m--) {
int opt=read(),l=read(),r=read();
if(!opt) change(1,l,r);
else printf("%d\n",query(1,l,r));
}
return 0;
}
洛谷 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 #include<bits/stdc++.h> 2 const int N=2e5+10; 3 using namespace std; 4 ...
- 洛谷 3870 [TJOI2009]开关
[题解] 线段树基础题.对于每个修改操作把相应区间的sum改为区间长度-sum即可. #include<cstdio> #include<algorithm> #include ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
随机推荐
- 面试的绝招(V1.0)
<软件自动化测试开发>出版了 测试开发公开课培训大讲堂 微信公众号:测试开发社区 测试开发QQ群:173172133 咨询QQ:7980068 咨询微信:zouhui1003it
- JVM、JRE和JDK三者间的区别和联系
简介:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JV ...
- 在 React Native 中使用 moment.js 無法載入語系檔案
moment.js 是很常見的日期時間 library,友善的 API 與極佳的執行效率是它的兩大賣點.例如 (new Date()).getFullYear(),如果使用 moment.js 我可以 ...
- Leetcode 206题 反转链表(Reverse Linked List)Java语言求解
题目描述: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 迭代解 ...
- 设计模式-12组合模式(Composite Pattern)
1.模式动机 很多时候会存在"部分-整体"的关系,例如:大学中的部门与学院.总公司中的部门与分公司.学习用品中的书与书包.在软件开发中也是这样,例如,文件系统中的文件与文件夹.窗体 ...
- vue项目开发,用webpack配置解决跨域问题
今天在本地开发时候碰到了跨域的问题,突然觉着跨域问题在所难免啊,之前没有没有碰到总觉着解决跨域很高大上的样纸,其实就是受限于网络的同源策略,跨域前后端都可以进行处理. 1,后端更改header hea ...
- iOS8 定位失败问题
iOS7升级到iOS8后,百度地图 iOS SDK 中的定位功能不可用,给广大开发者带来了不便,在此向大家分享一个方法来解决次问题.(官方的适配工作还在进行中,不久将会和广大开发者见面) 1.在inf ...
- 小白学 Python 数据分析(15):数据可视化概述
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- CVPR 2020 三篇有趣的论文解读
作者 | 文永亮 学校 | 哈尔滨工业大学(深圳) 研究方向 | 视频预测.时空序列预测 目录 AdderNet - 其实不需要这么多乘法 Deep Snake for Real-Time Insta ...
- LoadRunner 11破解方法:
LoadRunner 11破解方法: 请严格安装顺序操作! a.用LR8.0中的mlr5lprg.dll.lm70.dll覆盖LR11安装目录下“bin”文件夹中的对应文件: b.运行deleteli ...