「洛谷3870」「TJOI2009」开关【线段树】
题目链接
题解
来做一下水题来掩饰ZJOI2019考炸的心情QwQ。
很明显可以线段树。
维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的。
那么每一次翻转,\(s\)就变成了\(n-s\),\(n\)表示区间内所有灯的数量。
线段树维护一下就可以了。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 6;
int n, m;
namespace seg {
#define lc (nod << 1)
#define rc (nod << 1 | 1)
struct node {
int l, r, tg, s;
} tr[N << 2];
void pushup(int nod) { tr[nod].s = tr[lc].s + tr[rc].s; }
void pushdown(int nod, int l, int r) {
if (!tr[nod].tg) return;
int mid = (l + r) >> 1;
tr[lc].s = (mid - l + 1) - tr[lc].s; tr[lc].tg ^= 1;
tr[rc].s = (r - mid) - tr[rc].s; tr[rc].tg ^= 1;
tr[nod].tg = 0;
}
void build(int nod, int l, int r) {
tr[nod].l = l, tr[nod].r = r, tr[nod].s = 0, tr[nod].tg = 0;
if (l == r) return;
int mid = (l + r) >> 1;
build(lc, l, mid); build(rc, mid + 1, r);
pushup(nod);
}
void upd(int nod, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) {
tr[nod].s = (r - l + 1) - tr[nod].s;
tr[nod].tg ^= 1;
return;
}
int mid = (l + r) >> 1;
pushdown(nod, l, r);
if (ql <= mid) upd(lc, l, mid, ql, qr);
if (qr > mid) upd(rc, mid + 1, r, ql, qr);
pushup(nod);
}
int query(int nod, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tr[nod].s;
int mid = (l + r) >> 1, res = 0;
pushdown(nod, l, r);
if (ql <= mid) res += query(lc, l, mid, ql, qr);
if (qr > mid) res += query(rc, mid + 1, r, ql, qr);
return res;
}
}
int main() {
scanf("%d%d", &n, &m);
seg::build(1, 1, n);
for (int i = 1; i <= m; i ++) {
int opt, x, y; scanf("%d%d%d", &opt, &x, &y);
if (opt == 0) seg::upd(1, 1, n, x, y);
else printf("%d\n", seg::query(1, 1, n, x, y));
}
return 0;
}
「洛谷3870」「TJOI2009」开关【线段树】的更多相关文章
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- 洛谷 P1083 借教室【二分+差分/线段树】
二分mid,然后用1~mid的操作在差分序列上加减,最后把差分序列前缀和起来,看是否有有超过初始r值的 #include<iostream> #include<cstdio> ...
- 【洛谷4219】[BJOI2014]大融合(线段树分治)
题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...
- 洛谷P4577 [FJOI2018]领导集团问题(dp 线段树合并)
题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不 ...
- 洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)
题意 题目链接 Sol 说一个后缀自动机+线段树的无脑做法 首先建出SAM,然后对parent树进行dp,维护最大次大值,最小次小值 显然一个串能更新答案的区间是\([len_{fa_{x}} + 1 ...
- 洛谷.3437.[POI2006]TET-Tetris 3D(二维线段树)
题目链接 下落一个d*s的方块,则要在这个平面区域找一个最高的h' 更新整个平面区域的值为h+h' 对于本题,维护最大高度h和all 对于平面的x轴维护一棵线段树t1,每个t1的节点维护对应y轴的两棵 ...
- 洛谷P3586 [POI2015]LOG(贪心 权值线段树)
题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...
- 2018.08.11 洛谷P3224 [HNOI2012]永无乡(线段树合并)
传送门 给出n个带点权的点,支持连边和查询连通块第k大. 这个貌似就是一道线段树合并的裸板啊... 代码: #include<bits/stdc++.h> #define N 100005 ...
随机推荐
- python基础之逻辑运算符
python逻辑运算符: ①and ‘与’ 总结: 如果and左边为False,则直接返回左边的结果(False) 如果and左边为True,则返回的结果取决于右边的数值 ②or ‘或’ 总结: 如果 ...
- LIS3DH三轴加速度计-实现欧拉角(俯仰角,横滚角)
1. LIS3DH管脚定义 PS:LIS3DH和mpu6050的X和Y方向是相反的, mpu6050如下图所示: 2.LIS3DH加速度计介绍 由于LIS3DH只可以得到XYZ加速度,无法获取角速度, ...
- PHP一些常用的正则表达式分享给大家
一.校验数字的表达式 1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0- ...
- 基于jwt的用户登录认证
最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...
- matlab中的实时音频
音频系统工具箱™针对实时音频处理进行了优化.audioDeviceReader, audioDeviceWriter, audioPlayerRecorder, dsp.AudioFileReader ...
- Android探究之ANR
什么是ANR ANR:Application Not Responding,即应用程序无响应. 在Android中,ActivityManagerService(简称AMS)和WindowManage ...
- Testlink1.9.17使用方法( 第四章 测试需求管理 )
第四章 测试需求管理 QQ交流群:585499566 需求规格说明书是我们开展测试的依据.首先,我们可以对项目(产品)的需求规格说明书进行分解和整理,将其拆分为多个需求,一个项目可以包含多个需求,一个 ...
- C# Split的用法,Split分割字符串
C# Split的用法,Split分割字符串 分割单个字串:string str="来自张三的亲切问候!;string[] strarry=str.Split(new string[] { ...
- 我的Windows日常——炫酷的windows组件命令行打开方式
regedit -------注册表编辑器 gpedit.msc-------组策略编辑器 secpol.msc--------本地安全策略 control ----------控制面板 cmd--- ...
- Linux(CentOS7)下远程拷贝文件,scp命令
一.Linux版本 二.scp命令 scp [参数] [原路径] [目标路径] scp -P 22022 /home/file.war root@192.168.253.172:/home/test ...