【codevs1191】数轴染色
题目描述 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
#include<iostream> #include<queue> #include<cstdio> #include<math.h> #include<cstring> #include<algorithm> using namespace std; int tot[2000009]; bool b[2000009]; int n,m; void build(int l,int r,int id) { tot[id]=r-l+1; if(l == r) {return; } int mid=(l+r)/2; build(l,mid,id*2);build(mid+1,r,id*2+1); return; } void set(int l,int r,int id) { b[id*2]=1; b[id*2+1]=1; tot[id*2]=0;tot[id*2+1]=0; b[id]=0; } void add(int l,int r,int id,int tl,int tr) { if(tl<=l&&r<=tr) { tot[id]=0;b[id]=1; return ; } if(b[id]) set(l,r,id); int mid=(l+r)/2; if(tl<=mid) add(l,mid,id*2,tl,tr); if(tr>mid) add(mid+1,r,id*2+1,tl,tr); tot[id]=tot[id*2]+tot[id*2+1]; return; } int main() { scanf("%d%d",&n,&m); build(1,n,1); for(int i=1,l,r;i<=m;i++) { scanf("%d%d",&l,&r);add(1,n,1,l,r); cout<<tot[1]<<endl; } return 0; }