洛谷 P3870 [TJOI2009]开关
题意简述
有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 | 1];
}
void push_down(int x, int len)
{
a[x << 1] = (len - (len >> 1)) - a[x << 1];
a[x << 1 | 1] = (len >> 1) - a[x << 1 | 1];
la[x << 1] ^= 1;
la[x << 1 | 1] ^= 1;
la[x] = 0;
}
void change(int x, int l, int r, int l1, int r1)
{
if (l1 <= l && r <= r1)
{
a[x] = r - l + 1 - a[x];
la[x] ^= 1;
return;
}
if (la[x]) push_down(x, r - l + 1);
int mid = l + r >> 1;
if (l1 <= mid) change(x << 1, l, mid, l1, r1);
if (r1 > mid) change(x << 1 | 1, mid + 1, r, l1, r1);
push_up(x);
}
int query(int x, int l, int r, int l1, int r1, int ans = 0)
{
if (l1 <= l && r <= r1) return a[x];
if (la[x]) push_down(x, r - l + 1);
int mid = l + r >> 1;
if (l1 <= mid) ans += query(x << 1, l, mid, l1, r1);
if (r1 > mid) ans += query(x << 1 | 1, mid + 1, r, l1, r1);
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for (register int i = 1; i <= m; ++i)
{
scanf("%d", &opt);
if (!opt)
{
scanf("%d%d", &x, &y);
change(1, 1, n, x, y);
}
else
{
scanf("%d%d", &x, &y);
printf("%d\n", query(1, 1, n, x, y));
}
}
}
洛谷 P3870 [TJOI2009]开关的更多相关文章
- 洛谷P3870 [TJOI2009]开关
题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种: ...
- 洛谷 P3870 [TJOI2009]开关 题解
原题链接 前置知识: 线段树的单点.区间的修改与查询. 一看,我们需要维护两个操作: 区间取反: 区间求和. (因为区间 \(1\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区 ...
- 洛谷P3870 [TJOI2009] 开关 (线段树)
简单的省选题...... 打异或标记即可. 1 #include<bits/stdc++.h> 2 const int N=2e5+10; 3 using namespace std; 4 ...
- 洛谷 3870 [TJOI2009]开关
[题解] 线段树基础题.对于每个修改操作把相应区间的sum改为区间长度-sum即可. #include<cstdio> #include<algorithm> #include ...
- 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)
洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...
- 洛谷P3870开关题解
我们先看题面,一看是一个区间操作,再看一下数据范围,就可以很轻松地想到是用一个数据结构来加快区间查询和修改的速度,所以我们很自然的就想到了线段树. 但是这个题还跟普通的线段树不一样,这个题可以说要思考 ...
- 洛谷 p3870 开关 线段树模板
这两天学了很长时间于是做了一道水题 我就用了模板,就连任何优化都没有 就AC了,复杂度也很爆炸10个点1500多毫秒 这个题就是把lazy[]改成记录下修改的次数,每次修改的时候mod 2,因为反过来 ...
- Solution -「ZJOI 2019」「洛谷 P5326」开关
\(\mathcal{Description}\) Link. 有 \(n\) 个开关,初始时所有开关的状态为 \(0\).给定开关的目标状态 \(s_1,s_2,\cdots,s_n\).每 ...
- P3870 [TJOI2009]开关
思路 重题 代码 #include <iostream> #include <vector> #include <cstdio> #include <cstr ...
随机推荐
- JsonUtil(基于Jackson的实现)
JsonUtil(基于Jackson的实现) 前言: 其实,我一直想写一个有关Util的系列. 其中有四个原因: Util包作为项目的重要组成,是几乎每个项目不可或缺的一部分.并且Util包的Util ...
- 20140115-SqlHelper为什么是静态的
为什么SqlHelper(或工具类)是静态的? 静态构造函数仅调用一次(即只是在程序生命周期中实例一次),在程序驻留的应用程序域的生存期内,静态类一直保留在内存中 这样可以减少每次使用的实例过程,就是 ...
- UEditor 之初体验后记
1.UEditor 基本介绍 1.1.关于 UEditor 1.2.UEditor 现状 2.UEditor 简单使用 2.1.将 UEditor 源码集成到项目中 2.2.让 UEditor 的 U ...
- while 循环,运算符,字符串的格式化练习
1.判断下列逻辑语句的结果,一定要自己先分析 1)1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6 Ture ...
- HashSet源码分析:JDK源码系列
1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...
- 个人永久性免费-Excel催化剂功能第75波-标签式报表转标准数据源
数据处理永远是数据分析工作中重中之重的任务,大部分人深深地陷入在数据处理的泥潭中,今天Excel催化剂再接再厉,在过往已提供了主从结构报表数据源的数据转换后,再次给大家送上标签式报表数据源的数据转换操 ...
- 小白开学Asp.Net Core 开篇
开学Asp.Net Core 开篇 一.准备工作 1.操作环境:Win10 2.开发工具:VS2019 3.运行环境:.Net Core 2.2 4.数据库:SqlServer2012 二.项目搭建 ...
- hdu6406 Taotao Picks Apples(线段树)
Taotao Picks Apples 题目传送门 解题思路 建立一颗线段树,维护当前区间内的最大值maxx和可摘取的苹果数num.最大值很容易维护,主要是可摘取的苹果数怎么合并.合并左右孩子时,左孩 ...
- Tomcat(Windows)
百度云:链接:http://pan.baidu.com/s/1pKYrf79 密码:56t0 官网下载网址:http://archive.apache.org/dist/tomcat/tomca ...
- Oculus Rift 没有声音的解决方法
If you do not hear any audio when using Rift, please try the following steps: Check the Rift audio s ...