P3870 [TJOI2009] 开关(线段树)
P3870 [TJOI2009] 开关
思路:可以用线段树来维护区间中亮灯的个数,区间修改用加上懒标记就好
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 1e5 + 10;
struct SegmentTree{
	int l, r;
	LL sum, add;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define add(x) tree[x].add
}tree[4 * N];
int n, m;
void build(int p, int l, int r)
{
	l(p) = l, r(p) = r;
	if(l == r)	{sum(p) = 0; return;}
	int mid = (l + r) >> 1;
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
	sum(p) = sum(p << 1) + sum(p << 1 | 1);
}
//懒标记下传
void spread(int p)
{
	//节点p
	if(add(p))
	{
		sum(p << 1) = r(p << 1) - l(p << 1) + 1 - sum(p<<1);//更新左子节点信息
		sum(p << 1 | 1) = r(p << 1 | 1) - l(p << 1 | 1) + 1 - sum(p << 1 | 1);//更新右子节点信息
		add(p << 1) = ~add(p << 1);//给左子节点打延迟标记
		add(p << 1 | 1) = ~add(p << 1 | 1);//给右子节点打延迟标记
		add(p) = 0;	//清楚p的标记
	}
}
void change(int p, int l, int r)
{
	if(l <= l(p) && r >= r(p))
	{
		sum(p) = r(p) - l(p) + 1 - sum(p);
		add(p) = ~add(p);
		return;
	}
	spread(p);
	int mid = (l(p) + r(p)) >> 1;
	if(l <= mid) change(p << 1, l, r);
	if(r > mid)	change(p << 1 | 1, l, r);
	sum(p) = sum(p << 1) + sum(p << 1 | 1);
}
long long ask(int p, int l, int r)
{
	if(l <= l(p) && r >= r(p))	return sum(p);
	spread(p);
	int mid = (l(p) + r(p)) >> 1;
	long long val = 0;
	if(l <= mid) val += ask(p << 1, l , r);
	if(r > mid) val += ask(p << 1 | 1, l, r);
	return val;
}
void solve()
{
	cin >> n >> m;
	build(1, 1, n);
	while(m --)
	{
		int op, l, r, d;
		cin >> op >> l >> r;
		if(op == 0)	change(1, l, r);
		else	cout << ask(1, l, r) << endl;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
//	freopen("1.in", "r", stdin);
	solve();
	return 0;
}
P3870 [TJOI2009] 开关(线段树)的更多相关文章
- [TJOI2009]开关 (线段树)
		题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[ ... 
- 洛谷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\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区 ... 
- Luogu P2574 XOR的艺术 P3870 [TJOI2009]开关 P2846 [USACO08NOV]光开关Light Switching SP7259 LITE - Light Switching
		四倍经验题 简单线段树qwq(那你怎么还调了好几个小时) 修改:\(ans[cur]=(r-l+1-ans[cur]);\) 点表示的区间有多长就是有多少盏灯 亮着的关掉 暗的开启 就是上述语句了. ... 
- 洛谷P3870 [TJOI2009] 开关 (线段树)
		简单的省选题...... 打异或标记即可. 1 #include<bits/stdc++.h> 2 const int N=2e5+10; 3 using namespace std; 4 ... 
- 洛谷 p3870 开关 线段树模板
		这两天学了很长时间于是做了一道水题 我就用了模板,就连任何优化都没有 就AC了,复杂度也很爆炸10个点1500多毫秒 这个题就是把lazy[]改成记录下修改的次数,每次修改的时候mod 2,因为反过来 ... 
- P3870 [TJOI2009]开关
		思路 重题 代码 #include <iostream> #include <vector> #include <cstdio> #include <cstr ... 
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
		[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ... 
- 「洛谷3870」「TJOI2009」开关【线段树】
		题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ... 
随机推荐
- 根据模板动态生成word(二)使用poi生成word
			@ 目录 一.准备模板 1.创建模板文件 二.代码实践 1.引入依赖 2.自定义XWPFDocument 2.公用的方法和变量 3.工具类引用的包名 4.段落文本替换 5.图片替换 6.表格替换 7. ... 
- CSS border(边框)
			CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色. 可以为上下左右每个框 定制不同的样式和颜色. 边框样式 边框样式属性指定要显示什么样的边界. border-style属性用来定义 ... 
- sensor有点意思之RCCB传感器
			1.RCCB sensor 无意中看到一种特殊规格的传感器,RCCB (Red-Clear-Clear-Blue)sensor,第一次听到这个名词,咱不知道就查一查,检索到RCCB sensor是一种 ... 
- Linux chroot的关联操作 mount --bind
			假设新的根文件系统已经挂载到 /mnt mount --bind /dev /mnt/dev/ mount --bind /sys /mnt/sys/ mount --bind /proc /mnt/ ... 
- Linux 概念:grub2
			GRUB 2是许多发行版的缺省efi模式引导加载程序. grub2 与 grub 的区别 官方手册:https://www.gnu.org/software/grub/manual/grub/html ... 
- 层叠样式表(CSS)3
			三.层叠样式表属性 1.文字属性 font-size:字体大小 line-height:行高 font-family:字体 font-weight:粗细程度 .......等等很多,可自行学习 2.文 ... 
- 一文详解自然语言处理两大任务与代码实战:NLU与NLG
			自然语言处理(NLP)涵盖了从基础理论到实际应用的广泛领域,本文深入探讨了NLP的关键概念,包括词向量.文本预处理.自然语言理解与生成.统计与规则驱动方法等,为读者提供了全面而深入的视角. 作者 Te ... 
- 文心一言 VS 讯飞星火 VS chatgpt (76)-- 算法导论7.3 1题
			一.如果用go语言,为什么我们分析随机化算法的期望运行时间,而不是其最坏运行时间呢? 文心一言: 在分析算法的性能时,期望运行时间是一个重要的指标,它描述了算法在平均情况下的表现.期望运行时间考虑了所 ... 
- 7.1 C++ STL 非变易查找算法
			C++ STL 中的非变易算法(Non-modifying Algorithms)是指那些不会修改容器内容的算法,是C++提供的一组模板函数,该系列函数不会修改原序列中的数据,而是对数据进行处理.查找 ... 
- 5、Spring之bean的作用域和生命周期
			5.1.bean的作用域 5.1.1.单例(默认且常用) 5.1.1.1.配置bean 注意:当bean不配置scope属性时,默认是singleton(单例) <?xml version=&q ... 
