题意简述

有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]开关的更多相关文章

  1. 洛谷P3870 [TJOI2009]开关

    题目描述 现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\).然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种: ...

  2. 洛谷 P3870 [TJOI2009]开关 题解

    原题链接 前置知识: 线段树的单点.区间的修改与查询. 一看,我们需要维护两个操作: 区间取反: 区间求和. (因为区间 \(1\) 的个数,就是区间的和) 典型的 线段树 . 如果你只会线段树的 区 ...

  3. 洛谷P3870 [TJOI2009] 开关 (线段树)

    简单的省选题...... 打异或标记即可. 1 #include<bits/stdc++.h> 2 const int N=2e5+10; 3 using namespace std; 4 ...

  4. 洛谷 3870 [TJOI2009]开关

    [题解] 线段树基础题.对于每个修改操作把相应区间的sum改为区间长度-sum即可. #include<cstdio> #include<algorithm> #include ...

  5. 洛谷P3868 [TJOI2009]猜数字(中国剩余定理,扩展欧几里德)

    洛谷题目传送门 90分WA第二个点的看过来! 简要介绍一下中国剩余定理 中国剩余定理,就是用来求解这样的问题: 假定以下出现数都是自然数,对于一个线性同余方程组(其中\(\forall i,j\in[ ...

  6. 洛谷P3870开关题解

    我们先看题面,一看是一个区间操作,再看一下数据范围,就可以很轻松地想到是用一个数据结构来加快区间查询和修改的速度,所以我们很自然的就想到了线段树. 但是这个题还跟普通的线段树不一样,这个题可以说要思考 ...

  7. 洛谷 p3870 开关 线段树模板

    这两天学了很长时间于是做了一道水题 我就用了模板,就连任何优化都没有 就AC了,复杂度也很爆炸10个点1500多毫秒 这个题就是把lazy[]改成记录下修改的次数,每次修改的时候mod 2,因为反过来 ...

  8. Solution -「ZJOI 2019」「洛谷 P5326」开关

    \(\mathcal{Description}\)   Link.   有 \(n\) 个开关,初始时所有开关的状态为 \(0\).给定开关的目标状态 \(s_1,s_2,\cdots,s_n\).每 ...

  9. P3870 [TJOI2009]开关

    思路 重题 代码 #include <iostream> #include <vector> #include <cstdio> #include <cstr ...

随机推荐

  1. 快速掌握mongoDB(一)——mongoDB安装部署和常用shell命令

    1.mongoDB简介 mongoDB 是由C++语言编写的,是一种分布式的面向文档存储的开源nosql数据库.nosql是Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统 ...

  2. 【朝花夕拾】Android自定义View篇之(十一)View的滑动,弹性滑动与自定义PagerView

    前言 由于手机屏幕尺寸有限,但是又经常需要在屏幕中显示大量的内容,这就使得必须有部分内容显示,部分内容隐藏.这就需要用一个Android中很重要的概念——滑动.滑动,顾名思义就是view从一个地方移动 ...

  3. excel报表开发-- 根据datatable个数自动生成新sheet

    总结一下很久之前做的报表小程序,今日有问题又调试了一下. DB中存在一个表,记录了ID<自增长>,SqlStatement<sql查询语句>及其他必要字段,比如SheetNam ...

  4. .NET CORE 多语言实现方案

    根据市场需求,基于.NET CORE平台开发的RoadFlow工作流平台需要实现多语言版本.经过方案讨论和比对,决定采用.NET自带的本地化功能来实现多语言.话不多说,直接上实现方式. 首先修改Sta ...

  5. Leetcode solution 291: Word Pattern II

    Problem Statement Given a pattern and a string str, find if str follows the same pattern. Here follo ...

  6. Android 设置ImageView全屏

    Android 设置ImageView全屏代码如下: <ImageView android:id="@+id/iv_image" android:scaleType=&quo ...

  7. idea导入ssm javaweb maven项目

    本文笔者辛苦整理, 除了为方便大家贴的maven安装配置和方便的现有项目, 如转载请注明: https://www.cnblogs.com/m-yb/p/11229320.html idea导入ssm ...

  8. [剑指offer] 54. 字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  9. 机器学习之K均值聚类

      聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离.马氏距离.相关系数.余弦定理.层次聚类和K均值聚类等 1. K均值聚类思想   K均值聚类的基本思想是,通过迭代的方法寻找K个 ...

  10. python列表、元组、字典练习题

    1.元素分类 有如下值集合[11,22,33,44,55,66,77,88,99,90], 将所有大于66的值保存至字典的第一个key中,将小于66值保存至第二个key的值中. li = [11,22 ...