题解 P3870 【[TJOI2009]开关】】的更多相关文章

原题链接 前置知识: 线段树的单点.区间的修改与查询. 一看,我们需要维护两个操作: 区间取反: 区间求和. (因为区间 \(1\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区间修改,单点修改,区间查询,单点查询 的话,这题的 "取反" 是个难题. 但是,这个数组有个性质: \(a_i \in {0,1}\) 也就是说,假设一个数组一开始这样子: \(1\) \(2\) \(3\) \(4\) \(a_i\) \(0\) \(1\) \(0\) \(0\) \(…
题意简述 有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 <<…
思路 重题 代码 #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…
题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种:第一种操作指定一个区间\([a, b]\),然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间\([a, b]\),要求你输出这个区间内有多少盏灯是打开的.灯在初始时都是关着的. 输入输出格式 输入格式: 第一行有两个整数\(N\)和\(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=='-')…
直接进入正题: 分块: 分块分块,就是把一个长串东西,分为许多块,这样,我们就可以在操作一个区间的时候,对于在区间里面完整的块,直接操作块,不完整的直接操作即可,因为不完整,再加上一个块本身就不大,复杂度会很小的,然后需要输出的时候,单点输出直接把本来自身的值加上对块的操作加起来即可,而对于区间询问,格外在维护一个区间总和数组即可.那么问题来了:分为几块呢? 答案是当大小为\(n\)的序列,分为\(\sqrt{n}\),因为对于上述的操作,设块数为\(k\),复杂度是为\(O(\frac{n}{…
这个题我愣是交了好几遍没有过...... 后来@_皎月半洒花dalao告诉我说要^儿子节点的tag,然后就明白了...... 行吧,先上题面: 题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[a, b],然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间[a, b],要求你输出这个区间内有多少盏灯是打开的…
[题解] 线段树基础题.对于每个修改操作把相应区间的sum改为区间长度-sum即可. #include<cstdio> #include<algorithm> #include<cstring> #define LL long long #define rg register #define N 200010 #define ls (u<<1) #define rs (u<<1|1) #define mid ((a[u].l+a[u].r)>…
题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[a, b],然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间[a, b],要求你输出这个区间内有多少盏灯是打开的.灯在初始时都是关着的. 输入输出格式 输入格式: 第一行有两个整数N和M,分别表示灯的数目和操作的数目.接下来有M行,每行有三个整数,依次为:…
线段树做法很简单,但分块好啊 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++ a) #define nR(a,b,c) for(register int a = (b); a >= (…