题目描述

现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N。然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[a, b],然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间[a, b],要求你输出这个区间内有多少盏灯是打开的。灯在初始时都是关着的。

输入输出格式

输入格式:

第一行有两个整数N和M,分别表示灯的数目和操作的数目。接下来有M行,每行有三个整数,依次为:c, a, b。其中c表示操作的种类,当c的值为0时,表示是第一种操作。当c的值为1时表示是第二种操作。a和b则分别表示了操作区间的左右边界(1 ≤ a ≤ b ≤ N)。

输出格式:

每当遇到第二种操作时,输出一行,包含一个整数:此时在查询的区间中打开的灯的数目。

输入输出样例

输入样例#1:

4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4
输出样例#1: 
 1
 2
 

Solution

很典型的线段树区间反转.

即用线段树维护每一个点的操作次数,如果%2==1 那么就是开着的.

否则,则为关着的.

不过这个版本的是用的结构体储存了一下每个线段树节点的关的点数和开得点数.

如果需要操作就把当前开的和关的数量交换.

然后就是基本的操作.

#include<bits/stdc++.h>
#define maxn 100005
#define ll(x) x*2
#define rr(x) x*2+1
using namespace std;
struct tree{
int l,r,s0,s1,f;
}t[maxn*];
int n,m;
int read()
{
int x=; char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return x;
}
void build(int x,int l,int r)
{
t[x]=(tree){l,r,r-l+,,};
if (l==r) return; int mid=l+r>>;
build(ll(x),l,mid),build(rr(x),mid+,r);
}
void push_down(int x)
{
swap(t[ll(x)].s0,t[ll(x)].s1);
swap(t[rr(x)].s0,t[rr(x)].s1);
t[x].f^=,t[ll(x)].f^=,t[rr(x)].f^=;
}
void mdfy(int x,int l,int r)
{
if (t[x].l>r||t[x].r<l) return;
if (t[x].l>=l&&t[x].r<=r){
t[x].f^=,swap(t[x].s0,t[x].s1);
return;
}
if (t[x].f) push_down(x);
mdfy(ll(x),l,r),mdfy(rr(x),l,r);
t[x].s0=t[ll(x)].s0+t[rr(x)].s0;
t[x].s1=t[ll(x)].s1+t[rr(x)].s1;
}
int srch(int x,int l,int r){
if (t[x].l>r||t[x].r<l) return ;
if (t[x].l>=l&&t[x].r<=r) return t[x].s1;
if (t[x].f) push_down(x);
return srch(ll(x),l,r)+srch(rr(x),l,r);
}
int main(){
n=read(),m=read(),build(,,n);
while (m--){
int f=read(),l=read(),r=read();
if (f) cout<<srch(,l,r)<<endl;
else mdfy(,l,r);
}
return ;
}

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

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

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

  2. 「洛谷3870」「TJOI2009」开关【线段树】

    题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...

  3. hdu 5861 Road 两棵线段树

    传送门:hdu 5861 Road 题意: 水平线上n个村子间有 n-1 条路. 每条路开放一天的价格为 Wi 有 m 天的操作,每天需要用到村子 Ai~Bi 间的道路 每条路只能开放或关闭一次. ( ...

  4. HDU 5861 Road (线段树)

    Road 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Description There are n villages alo ...

  5. BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )

    线段树.. --------------------------------------------------------------------------------- #include< ...

  6. 【线段树】Bzoj1230 [Usaco2008 Nov]lites 开关灯

    Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...

  7. [IOI2018]机械娃娃——线段树+构造

    题目链接: IOI2018doll 题目大意:有一个起点和$m$个触发器,给出一个长度为$n$的序列$a$,要求从起点出发按$a$的顺序经过触发器并回到起点(一个触发器可能被经过多次也可能不被经过), ...

  8. codevs 1690 开关灯 线段树+延迟标记

    1690 开关灯  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...

  9. 线段树--codevs 1690 开关灯

    codevs 1690 开关灯 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description YYX家门前的街上有N(2& ...

随机推荐

  1. vijos 1524 最小监视代价

    背景 看到Vijos上此类型的题目较少,特地放一道上来给大家练练. 描述 由于yxy小朋友做了一些不该做的事,他被jzp关进了一个迷宫里.由于jzp最近比较忙,疏忽大意了一些,yxy可以在迷宫中任意走 ...

  2. 数组、Math、JOSN总结

    json对象: 1.数组有length属性[尽量使用for循环] 2.而json没有length属性[可以使用for...in...循环] 3.for in 不能遍历页面中的节点对象. for ( v ...

  3. 如何 Scale Up/Down Deployment?【转】

    伸缩(Scale Up/Down)是指在线增加或减少 Pod 的副本数.Deployment nginx-deployment 初始是两个副本. k8s-node1 和 k8s-node2 上各跑了一 ...

  4. Codeforces Round #275(Div. 2)-C. Diverse Permutation

    http://codeforces.com/contest/483/problem/C C. Diverse Permutation time limit per test 1 second memo ...

  5. scanf函数详解

    函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...

  6. spring中常用的注解

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...

  7. 【OS_Linux】Linux系统中目录及文件管理

    1.Linux系统中目录的树状结构 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里. /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录, ...

  8. nginx 无法加载css/js图片等文件 404 not fund

    刚配置Nginx反向代理,Nginx可能会出现无法加载css.js或者图片等文件,这里需要在配置文件*.conf里面加上如下配置项. location ~ .*\.(js|css|png|jpg)$ ...

  9. 如何用纯 CSS 创作牛奶文字变换效果

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/MGNWOm 可交互视频教 ...

  10. int main(int argc,char *argv[])的具体含义

    int main(int argc,char * argv[]) argv为指针的指针 argc为整数 char **argv or: char *argv[] or: char argv[][] m ...