洛谷P2846 光开关Light Switching
题目描述
灯是由高科技——外星人鼠标操控的。你只要左击两个灯所连的鼠标,
这两个灯,以及之间的灯都会由暗变亮,或由亮变暗。右击两个灯所连的鼠
标,你就可以知道这两个灯,以及之间的灯有多少灯是亮的。起初所有灯都是暗的,你的任务是在\(LZ\)之前算出灯的亮灭。
输入输出格式
输入格式:
第1 行: 用空格隔开的两个整数\(N\) 和\(M\),\(N\) 是灯数
第\(2..M+1\) 行: 每行表示一个操作, 有三个用空格分开的整数: 指令号, \(S_i\) 和\(E_i\)
第\(1\) 种指令(用\(0\) 表示)包含两个数字\(S_i\) 和\(E_i\) (\(1 \leq S_i \leq E_i \leq N\)), 它们表示起
始开关和终止开关. 表示左击
第\(2\) 种指令(用\(1\) 表示)同样包含两个数字\(S_i\) 和\(E_i\) (\(1 \leq S_i \leq E_i \leq N\)), 不过这
种指令是询问从\(S_i\) 到\(E_i\) 之间的灯有多少是亮着的.
输出格式:
输入输出样例
输入样例#1:
4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4
输出样例#1:
1
2
说明

思路:这道题目涉及到区间修改和区间查询,因此可以用线段树来维护,那该怎么维护呢?继续观察,可以发现,因为刚开始所以灯都是关着的,然后修改一次就灯的状态就会变化一次,我们可以用\(1\)和\(0\)分别代替开关状态,那么修改操作不就成了区间异或运算么?查询操作不就成了查询区间中\(1\)的个数了么?而且初始值都是0,所以无需建树,然后用线段树维护一个区间\(1\)的个数即可。
代码:
#include<cstdio>
#include<algorithm>
#include<cctype>
#define maxn 100007
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
int n,m,sum[maxn<<2],lazy[maxn<<2];
inline int qread() {
char c=getchar();int num=0,f=1;
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num*10+c-'0';
return num*f;
}
inline void pushup(int rt) {
sum[rt]=sum[ls]+sum[rs];
}
inline void pushdown(int rt, int len) {
if(lazy[rt]) {
lazy[ls]^=1;
lazy[rs]^=1;
sum[ls]=(len-(len>>1))-sum[ls];
sum[rs]=(len>>1)-sum[rs];
lazy[rt]=0;
}
}
void modify(int rt, int l, int r, int L, int R) {
if(L>r||R<l) return;
if(L<=l&&r<=R) {
sum[rt]=r-l+1-sum[rt];
lazy[rt]^=1;
return;
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
modify(ls,l,mid,L,R),modify(rs,mid+1,r,L,R);
pushup(rt);
}
int csum(int rt, int l, int r, int L, int R) {
if(L>r||R<l) return 0;
if(L<=l&&r<=R) return sum[rt];
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
return csum(ls,l,mid,L,R)+csum(rs,mid+1,r,L,R);
}
int main() {
n=qread(),m=qread();
for(int i=1,k,l,r;i<=m;++i) {
k=qread(),l=qread(),r=qread();
if(!k) modify(1,1,n,l,r);
else printf("%d\n",csum(1,1,n,l,r));
}
return 0;
}
洛谷P2846 光开关Light Switching的更多相关文章
- 洛谷 P2846 光开关
https://www.luogu.org/problemnew/show/P2846 好多题解用线段树来写,然而分块不是更简单好些吗? 一个数组use记录这一块进行了多少次开关操作,两边单独计算,注 ...
- 洛谷——P2846 [USACO08NOV]光开关Light Switching
P2846 [USACO08NOV]光开关Light Switching 题目大意: 灯是由高科技——外星人鼠标操控的.你只要左击两个灯所连的鼠标, 这两个灯,以及之间的灯都会由暗变亮,或由亮变暗.右 ...
- 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]
P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them p ...
- P2846 [USACO08NOV]光开关Light Switching
题目描述 Farmer John tries to keep the cows sharp by letting them play with intellectual toys. One of th ...
- 搜索【洛谷P2845】 [USACO15DEC]Switching on the Lights 开关灯
P2845 [USACO15DEC]Switching on the Lights 开关灯 题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一 ...
- LuoguP2846[USACO08NOV]光开关Light Switching【线段树维护区间异或】By cellur925
题目传送门 题目大意,给你一串灯,按一下开关可以将灯的状态取反(开变成关,关变成开).维护这个序列的两种操作:询问区间内有多少灯是开着的,区间按灯. 开始想的是分别维护区间内0的数量,1的数量,两个懒 ...
- 【洛谷】【线段树+位运算】P2574 XOR的艺术
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...
- 洛谷P3870 [TJOI2009]开关
题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种: ...
- 洛谷P2179 骑行川藏
什么毒瘤... 解:n = 1的,发现就是一个二次函数,解出来一个v的取值范围,选最大的即可. n = 2的,猜测可以三分.于是先二分给第一段路多少能量,然后用上面的方法求第二段路的最短时间.注意剩余 ...
随机推荐
- Debian for ARM
/************************************************************************* * Debian for ARM * 说明: * ...
- 说几个JS优化技巧吧
JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...
- 【Facebook】等差子序列个数
题目: 给定一整数数列,问数列有多少个子序列是等差数列. 即对于包含N个数的数列A,A(0),A(1),……,A(N-1),有多少组(P(0),P(1),……,P(k))满足0<=P(0)< ...
- 51nod 1450 闯关游戏——期望dp
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1450 想了半天,不知道不能走的状态(即最后不足m个的状态)怎么办. ...
- 类方法,实例方法,静态方法,@property的应用
class test(object): h = 'hello' w = 'world' def demo(self): print("demo") def test_class(s ...
- Code:template
ylbtech-Code: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylbtech.cn ...
- 26.【转载】挖洞技巧:绕过短信&邮箱轰炸限制以及后续
邮箱轰炸可能对企业来说危害很小,但对用户危害很大.短信轰炸相比邮箱轰炸,带来的危害涉及到企业和用户. 那么这些问题都存在在哪些方面呢? ①:登录处 ②:注册处 ③:找回密码处 ④:绑定处 ⑤:活动领取 ...
- JQuery获取body的大小
$('body').height(); $('body').width();
- js复习笔记
isNaN(x) 1.判断结果不是纯数字, var a=1234var b =isNan(a) //b是 false 因为a是纯数字 var a="abc123"var b =is ...
- 【classloader】
一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程 ...