题目描述

现有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:

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

Solution

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

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

否则,则为关着的.

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

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

然后就是基本的操作.

  1. #include<bits/stdc++.h>
  2. #define maxn 100005
  3. #define ll(x) x*2
  4. #define rr(x) x*2+1
  5. using namespace std;
  6. struct tree{
  7. int l,r,s0,s1,f;
  8. }t[maxn*];
  9. int n,m;
  10. int read()
  11. {
  12. int x=; char ch=getchar();
  13. while (!isdigit(ch)) ch=getchar();
  14. while(isdigit(ch)) x=x*+ch-'',ch=getchar();
  15. return x;
  16. }
  17. void build(int x,int l,int r)
  18. {
  19. t[x]=(tree){l,r,r-l+,,};
  20. if (l==r) return; int mid=l+r>>;
  21. build(ll(x),l,mid),build(rr(x),mid+,r);
  22. }
  23. void push_down(int x)
  24. {
  25. swap(t[ll(x)].s0,t[ll(x)].s1);
  26. swap(t[rr(x)].s0,t[rr(x)].s1);
  27. t[x].f^=,t[ll(x)].f^=,t[rr(x)].f^=;
  28. }
  29. void mdfy(int x,int l,int r)
  30. {
  31. if (t[x].l>r||t[x].r<l) return;
  32. if (t[x].l>=l&&t[x].r<=r){
  33. t[x].f^=,swap(t[x].s0,t[x].s1);
  34. return;
  35. }
  36. if (t[x].f) push_down(x);
  37. mdfy(ll(x),l,r),mdfy(rr(x),l,r);
  38. t[x].s0=t[ll(x)].s0+t[rr(x)].s0;
  39. t[x].s1=t[ll(x)].s1+t[rr(x)].s1;
  40. }
  41. int srch(int x,int l,int r){
  42. if (t[x].l>r||t[x].r<l) return ;
  43. if (t[x].l>=l&&t[x].r<=r) return t[x].s1;
  44. if (t[x].f) push_down(x);
  45. return srch(ll(x),l,r)+srch(rr(x),l,r);
  46. }
  47. int main(){
  48. n=read(),m=read(),build(,,n);
  49. while (m--){
  50. int f=read(),l=read(),r=read();
  51. if (f) cout<<srch(,l,r)<<endl;
  52. else mdfy(,l,r);
  53. }
  54. return ;
  55. }

[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. 一张图看懂苹果MacBook所有屏幕分辨率

    苹果全新12寸超薄MacBook比曾经最薄的MacBook Air更薄,不过却配备了Retina视网膜显示屏.12英寸RetinaMacBook上的显示屏分辨率为2304*1440,虽然不如15寸和1 ...

  2. go get 升级所有

    go get -u all go get -u go mod update go get -u full_package_name    go get -u github.com/... // ('. ...

  3. Java创建图片文件缩略图

    public static void uploadImg(InputStream file, String filePath, String fileName, int widthdist, int ...

  4. jquery的同步和异步

    之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去 ...

  5. jdk concurrent 中 AbstractQueuedSynchronizer uml 图.

    要理解 ReentrantLock 先理解AbstractQueuedSynchronizer 依赖关系. 2

  6. javaEE(2)_http协议

    一.HTTP协议简介 1.客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式.dos环境下可直接通过telnet ...

  7. ios之UITextfield

    //初始化textfield并设置位置及大小   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...

  8. LeetCode 三角形最小路径和

    给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11 ...

  9. mysql 备份解密脚本

    #!/bin/bash #by sk 备份解码脚本 echo "-------------------------------------------------" functio ...

  10. Bluefruit LE Sniffer - Bluetooth Low Energy (BLE 4.0) - nRF51822 驱动安装及使用

    BLE Sniffer https://www.adafruit.com/product/2269 Bluefruit LE Sniffer - Bluetooth Low Energy (BLE 4 ...