在一條數軸上有N個點,分別是1~N。一開始全部的點都被染成黑色。接着
咱們進行M次操做,第i次操做將[Li,Ri]這些點染成白色。請輸出每一個操做執行後
剩餘黑色點的個數。spa
輸入一行爲N和M。下面M行每行兩個數Li、Ricode
輸出M行,爲每次操做後剩餘黑色點的個數。blog
10 3
3 3
5 7
2 8ip
9
6
3io
數據限制
對30%的數據有1<=N<=2000,1<=M<=2000
對100%數據有1<=Li<=Ri<=N<=200000,1<=M<=200000class
線段樹;數據
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 }