P3870 [TJOI2009] 开关(线段树)】的更多相关文章

题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[a, b],然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间[a, b],要求你输出这个区间内有多少盏灯是打开的.灯在初始时都是关着的. 输入输出格式 输入格式: 第一行有两个整数N和M,分别表示灯的数目和操作的数目.接下来有M行,每行有三个整数,依次为:…
题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种:第一种操作指定一个区间\([a, b]\),然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间\([a, b]\),要求你输出这个区间内有多少盏灯是打开的.灯在初始时都是关着的. 输入输出格式 输入格式: 第一行有两个整数\(N\)和\(M\),分别表示灯的…
题意简述 有n盏灯,默认为关,有两个操作: 1.改变l~r的灯的状态(把开着的灯关上,关着的灯打开) 2.查询l~r开着的灯的数量 题解思路 维护一个线段树,支持区间修改,区间查询 懒标记每次^1 代码 #include <cstdio> using namespace std; int n, m, opt, x, y; int a[400010], la[400010]; void push_up(int x) { a[x] = a[x << 1] + a[x <<…
原题链接 前置知识: 线段树的单点.区间的修改与查询. 一看,我们需要维护两个操作: 区间取反: 区间求和. (因为区间 \(1\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区间修改,单点修改,区间查询,单点查询 的话,这题的 "取反" 是个难题. 但是,这个数组有个性质: \(a_i \in {0,1}\) 也就是说,假设一个数组一开始这样子: \(1\) \(2\) \(3\) \(4\) \(a_i\) \(0\) \(1\) \(0\) \(0\) \(…
四倍经验题 简单线段树qwq(那你怎么还调了好几个小时) 修改:\(ans[cur]=(r-l+1-ans[cur]);\) 点表示的区间有多长就是有多少盏灯 亮着的关掉 暗的开启 就是上述语句了. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; #define M…
简单的省选题...... 打异或标记即可. 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=='-')…
这两天学了很长时间于是做了一道水题 我就用了模板,就连任何优化都没有 就AC了,复杂度也很爆炸10个点1500多毫秒 这个题就是把lazy[]改成记录下修改的次数,每次修改的时候mod 2,因为反过来再返回去就一样了 修改变成 sum[root] = r - l + 1 - sum[root]; 其他的几乎就没区别了 #include<bits/stdc++.h> using namespace std; inline int read(){int s=0,w=1;char ch=getcha…
思路 重题 代码 #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #define ls rt<<1 #define rs rt<<1|1 #define ll long long #defi…
[题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[l,r],伤害为伤害串的这个范围内中1的个数 3. 会被随机修改伤害串中的数值,修改的方法是把[l,r]中的所有数xor上1 AKN想知道一些时刻的伤害,请你帮助他求出这个伤害 [输入格式:] 第一行两个数n,m,表示长度为n的01串,有m个时刻 第二行一个长度为n的01串,为初始伤害串 第三行开始…
题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. 那么每一次翻转,\(s\)就变成了\(n-s\),\(n\)表示区间内所有灯的数量. 线段树维护一下就可以了. 代码 #include <bits/stdc++.h> using namespace std; const int N = 100000 + 6; int n, m; namespac…