1690 开关灯

USACO

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人陆续按下开关,这些开关可以改变从第i盏灯到第j盏灯的状态,现在YYX想知道,从第x盏灯到第y盏灯中有多少是亮着的(1<=i,j,x,y<=N)

输入描述 Input Description
第 1 行: 用空格隔开的两个整数N和M
第 2..M+1 行: 每行表示一个操作, 有三个用空格分开的整数: 指令号(0代表按下开关,1代表询问状态), x 和 y 
输出描述 Output Description

第 1..询问总次数 行:对于每一次询问,输出询问的结果

样例输入 Sample Input

4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4

样例输出 Sample Output
1
2
 
数据范围及提示 Data Size & Hint

一共4盏灯,5个操作,下面是每次操作的状态(X代表关上的,O代表开着的):

XXXX -> OOXX -> OXOO -> 询问1~3 -> OOXX -> 询问1~4

 
/*
这道题数据比较强啊
每次更新答案=当前区间总数-当前答案。
标记取反。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100005 using namespace std;
int n,m,x,y,z;
struct node
{
int l,r,sum,dis,flag;
}tre[maxn<<]; inline int init()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void build(int now,int l,int r)
{
tre[now].l=l;tre[now].r=r;tre[now].sum=r-l+;
if(l==r) return;
int mid=(l+r)>>;
build(now<<,l,mid);build(now<<|,mid+,r);
} void down(int now)
{
tre[now<<].flag^=;
tre[now<<|].flag^=;
tre[now<<].dis=tre[now<<].sum-tre[now<<].dis;
tre[now<<|].dis=tre[now<<|].sum-tre[now<<|].dis;
tre[now].flag=;
} void change(int now,int l,int r)
{
if(tre[now].l==l&&tre[now].r==r)
{
tre[now].flag^=;
tre[now].dis=tre[now].sum-tre[now].dis;
return;
}
if(tre[now].flag) down(now);
int mid=(tre[now].l+tre[now].r)>>;
if(l>mid) change(now<<|,l,r);
else if(r<=mid) change(now<<,l,r);
else
{
change(now<<,l,mid);
change(now<<|,mid+,r);
}
tre[now].dis=tre[now<<].dis+tre[now<<|].dis;
} int query(int now,int l,int r)
{
if(tre[now].l==l&&tre[now].r==r) return tre[now].dis;
if(tre[now].flag) down(now);
int mid=(tre[now].l+tre[now].r)>>;
if(l>mid) return query(now<<|,l,r);
else if(r<=mid) return query(now<<,l,r);
else return query(now<<,l,mid)+query(now<<|,mid+,r);
} int main()
{
n=init();m=init();
build(,,n);
for(int i=;i<=m;i++)
{
x=init();y=init();z=init();
if(!x) change(,y,z);
else printf("%d\n",query(,y,z));
}
return ;
}

最新文章

  1. Angular2学习笔记——路由器模型(Router)
  2. C++ namespace
  3. iOS阶段学习第31天笔记(UINavigationBar介绍)
  4. JAVA 缓存Ehcache详细解毒
  5. 有时候dfs可以简化各种组合的操作
  6. iPhone开发 Swift - NSNotification 通知
  7. nau8822 codec driver 录音时mic bias 无法自动打开问题
  8. Linux 软链接和硬链接的理解与学习
  9. python的闭包以及闭包在设计里的意图和作用
  10. Linux 软件源设置
  11. Python学习日志(一)
  12. Action的创建和配置
  13. android查看源码的时候看不了
  14. [题解]洛谷P2709 小B的询问
  15. 获取Android设备唯一标识码
  16. mariadb-5.5安装
  17. 生产者消费者模式 php 【转】
  18. BZOJ 1093 最大半连通子图 题解
  19. 洛谷P3387缩点
  20. 隐藏的Swiper显示后无法获取正确的宽度和高度

热门文章

  1. Luogu P2847 [USACO20DEC]Moocast(gold)奶牛广播-金
  2. 深入理解PHP之strpos
  3. POJ 3468 A Simple Problem with Integers(线段树水题)
  4. 关于Scrum 实战故事录播的感悟升级
  5. SSH三种框架及表示层、业务层和持久层的理解(转)
  6. codevs2449 骑士精神
  7. CH上的Think Bear#1模拟赛
  8. 关于static静态块的使用和static list的使用
  9. 重啓ubuntu后 VNC 自動運行
  10. Android MTP 文件浏览Demo