题目描述 Description
在一条数轴上有N个点,分别是1~N。一开始所有的点都被染成黑色。接着
我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色。请输出每个操作执行后
剩余黑色点的个数。
输入描述 Input Description
输入一行为N和M。下面M行每行两个数Li、Ri
输出描述 Output Description
输出M行,为每次操作后剩余黑色点的个数。
样例输入 Sample Input
10 3
3 3
5 7
2 8
样例输出 Sample Output
9
6
3
数据范围及提示 Data Size & Hint
数据限制
对30%的数据有1<=N<=2000,1<=M<=2000
对100%数据有1<=Li<=Ri<=N<=200000,1<=M<=200000
思路:把区间的值改成0,求区间和;
#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> #define true ture #define false flase using namespace std; #define ll long long int scan() { int res = 0 , ch ; while( !( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ ) ) { if( ch == EOF ) return 1 << 30 ; } res = ch - ‘0‘ ; while( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ ) res = res * 10 + ( ch - ‘0‘ ) ; return res ; } struct is { int l,r; int num; int lazy; }tree[200010*3]; void build_tree(int l,int r,int pos) { tree[pos].l=l; tree[pos].r=r; tree[pos].lazy=-1; if(l==r) { tree[pos].num=1; //scanf("%lld",&tree[pos].num); return; } int mid=(l+r)/2; build_tree(l,mid,pos*2); build_tree(mid+1,r,pos*2+1); tree[pos].num=tree[pos*2].num+tree[pos*2+1].num; } void update(int l,int r,int change,int pos) { if(tree[pos].l==l&&tree[pos].r==r) { tree[pos].lazy=change; tree[pos].num=0; return; } if(tree[pos].lazy==0) { tree[pos*2].num=(tree[pos*2].r+1-tree[pos*2].l)*tree[pos].lazy; tree[pos*2+1].num=(tree[pos*2+1].r+1-tree[pos*2+1].l)*tree[pos].lazy; tree[pos*2].lazy=tree[pos].lazy; tree[pos*2+1].lazy=tree[pos].lazy; tree[pos].lazy=-1; } int mid=(tree[pos].l+tree[pos].r)/2; if(r<=mid) update(l,r,change,pos*2); else if(l>mid) update(l,r,change,pos*2+1); else { update(l,mid,change,pos*2); update(mid+1,r,change,pos*2+1); } tree[pos].num=tree[pos*2].num+tree[pos*2+1].num; } int query(int l,int r,int pos) { //cout<<l<<" "<<r<<" "<<pos<<endl; if(tree[pos].l==l&&tree[pos].r==r) return tree[pos].num; if(tree[pos].lazy==0) { tree[pos*2].num=0; tree[pos*2+1].num=0; tree[pos*2].lazy=0; tree[pos*2+1].lazy=0; tree[pos].lazy=-1; } int mid=(tree[pos].l+tree[pos].r)/2; if(l>mid) return query(l,r,pos*2+1); else if(r<=mid) return query(l,r,pos*2); else return query(l,mid,pos*2)+query(mid+1,r,pos*2+1); } int main() { int x,q,i,t; while(~scanf("%d",&x)) { scanf("%d",&q); build_tree(1,x,1); while(q--) { int flag,change=0,l,r; scanf("%d%d",&l,&r); update(l,r,change,1); printf("%d\n",query(1,x,1)); } } return 0; }
时间: 2024-10-10 18:04:40