[codeVS] 1191 數軸染色

題目描述 Description

在一條數軸上有N個點,分別是1~N。一開始全部的點都被染成黑色。接着
咱們進行M次操做,第i次操做將[Li,Ri]這些點染成白色。請輸出每一個操做執行後
剩餘黑色點的個數。spa

輸入描述 Input Description

輸入一行爲N和M。下面M行每行兩個數Li、Ricode

輸出描述 Output Description

輸出M行,爲每次操做後剩餘黑色點的個數。blog

樣例輸入 Sample Input

10 3
3 3
5 7
2 8ip

樣例輸出 Sample Output

9
6
3io

數據範圍及提示 Data Size & Hint

數據限制
對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 }
相關文章
相關標籤/搜索