codevs 1191 树轴染色 线段树区间定值,求和
2017-03-02 15:11
381 查看
题目链接:
http://codevs.cn/problem/1191/题意:
题解:
sum表示这段区间白点的个数,初始全部为0。lazy为1表示到达这个区间需要被更新为白点,到需要更新的时候再pushdown
代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MS(a) memset(a,0,sizeof(a)) #define MP make_pair #define PB push_back const int INF = 0x3f3f3f3f; const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ////////////////////////////////////////////////////////////////////////// const int maxn = 4e5+10; struct node{ int l,r,sum,lazy; }tree[maxn<<2]; void pushup(int rt){ tree[rt].sum = tree[rt<<1].sum + tree[rt<<1|1].sum; } void pushdown(int rt,int x){ if(tree[rt].lazy!=-1){ tree[rt<<1].lazy = tree[rt<<1|1].lazy = tree[rt].lazy; tree[rt<<1].sum = (x-(x>>1)); tree[rt<<1|1].sum = (x>>1); tree[rt].lazy = -1; } } void build(int rt,int l,int r){ tree[rt].l = l, tree[rt].r = r; tree[rt].lazy = -1; if(l == r) tree[rt].sum = 0; else{ int mid = (l+r)/2; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); pushup(rt); } } void update(int rt,int l,int r){ int L = tree[rt].l, R = tree[rt].r; if(l<=L && R<=r){ tree[rt].lazy = 1; tree[rt].sum = R-L+1; return ; }else{ pushdown(rt,R-L+1); int mid = (L+R)/2; if(l <= mid) update(rt<<1,l,r); if(r > mid) update(rt<<1|1,l,r); pushup(rt); } } int main(){ int n=read(),m=read(); build(1,1,n); for(int i=0; i<m; i++){ int a=read(),b=read(); update(1,a,b); cout << n-tree[1].sum << endl; } return 0; }
相关文章推荐
- codevs 1191 树轴染色 线段树区间定值,求和
- 【codevs1191】数轴染色 线段树 区间修改+固定区间查询
- CODE[VS] 1082 线段树练习 3 (区间修改、区间求和)
- CODE[VS] 1080 线段树练习(单值修改、区间求和)
- codevs 1082 线段树:区间更新,区间求和
- codevs 1191 线段树 区间更新(水)
- codevs 1191 数轴染色 区间更新加延迟标记
- 【codevs1690】开关灯 线段树 区间修改+区间求和(标记)
- 【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****
- Codevs 1191 数轴染色
- codevs 1082 线段树练习 3(区间维护)
- codevs 1191 数轴染色
- [CodeVS1082] 线段树练习3(区间修改+询问区间和)
- 【codevs 1080】线段树练习(单点修改+区间和)
- 【NOIP2012】 CODE[VS] 1217 借教室(线段树维护区间最小值)
- [codeVS] 1191 数轴染色
- 【codevs1191】数轴染色 并查集
- codevs 1082 线段树练习 3 区间更新+延迟标记
- hdu1698(线段树染色区间求和)
- HDU 1698 just a hook 线段树,区间定值,求和