[codeVS] 1191 数轴染色
题目描述 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
思路
线段树;
代码实现
1 #include<cstdio> 2 const int maxn=2e5+10; 3 inline int min_(int x,int y){return x<y?x:y;} 4 inline int max_(int x,int y){return x>y?x:y;} 5 int n,m,l,r; 6 int t[maxn<<2]; 7 void move(int k,int l,int r,int al,int ar){ 8 if(t[k]==r-l+1) return; 9 if(l==al&&r==ar){ 10 t[k]=r-l+1; 11 return; 12 } 13 int mid=l+r>>1,ls=k<<1,rs=ls|1; 14 if(al<=mid) move(ls,l,mid,al,min_(ar,mid)); 15 if(ar>mid) move(rs,mid+1,r,max_(al,mid+1),ar); 16 t[k]=t[ls]+t[rs]; 17 } 18 int main(){ 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=m;i++){ 21 scanf("%d%d",&l,&r); 22 move(1,1,n,l,r); 23 printf("%d\n",n-t[1]); 24 } 25 return 0; 26 }