博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codevs1690 开关灯(线段树)
阅读量:5305 次
发布时间:2019-06-14

本文共 2357 字,大约阅读时间需要 7 分钟。

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
#include
#include
#define maxn 100005using namespace std;int n,m,x,y,z;struct node{ int l,r,sum,dis,flag;}tre[maxn<<2];inline int init(){ int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){
if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';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+1; if(l==r) return; int mid=(l+r)>>1; build(now<<1,l,mid);build(now<<1|1,mid+1,r);}void down(int now){ tre[now<<1].flag^=1; tre[now<<1|1].flag^=1; tre[now<<1].dis=tre[now<<1].sum-tre[now<<1].dis; tre[now<<1|1].dis=tre[now<<1|1].sum-tre[now<<1|1].dis; tre[now].flag=0;}void change(int now,int l,int r){ if(tre[now].l==l&&tre[now].r==r) { tre[now].flag^=1; tre[now].dis=tre[now].sum-tre[now].dis; return; } if(tre[now].flag) down(now); int mid=(tre[now].l+tre[now].r)>>1; if(l>mid) change(now<<1|1,l,r); else if(r<=mid) change(now<<1,l,r); else { change(now<<1,l,mid); change(now<<1|1,mid+1,r); } tre[now].dis=tre[now<<1].dis+tre[now<<1|1].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)>>1; if(l>mid) return query(now<<1|1,l,r); else if(r<=mid) return query(now<<1,l,r); else return query(now<<1,l,mid)+query(now<<1|1,mid+1,r);}int main(){ n=init();m=init(); build(1,1,n); for(int i=1;i<=m;i++) { x=init();y=init();z=init(); if(!x) change(1,y,z); else printf("%d\n",query(1,y,z)); } return 0;}

 

转载于:https://www.cnblogs.com/L-Memory/p/6800710.html

你可能感兴趣的文章
修改博客园css样式
查看>>
Python3 高阶函数
查看>>
初始面向对象
查看>>
docker一键安装
查看>>
leetcode Letter Combinations of a Phone Number
查看>>
ALS算法 (面试准备)
查看>>
Unity 5.4 测试版本新特性---因吹丝停
查看>>
7.5 文件操作
查看>>
DFS-hdu-2821-Pusher
查看>>
MyEclipse中将普通Java项目convert(转化)为Maven项目
查看>>
node js 安装.node-gyp/8.9.4 权限 无法访问
查看>>
windows基本命令
查看>>
VMware中CentOS设置静态IP
查看>>
[poj1006]Biorhythms
查看>>
jsp
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
JavaScript跨域总结与解决办法
查看>>
Hover功能
查看>>
[LeetCode] Jump Game II
查看>>
js千分位处理
查看>>