1299 切水果
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题目描述 Description
简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的水果被重复切),每切完一次输出剩下水果数量
数据已重新装配,不会出现OLE错误
时限和数据范围适当修改,避免数据包过大而浪费空间资源
输入描述 Input Description
第1行共包括2个正整数,分别为N,M。
接下来m行每行两个正整数L,R
输出描述 Output Description
一共输出M行,每行输出切完之后剩下水果数量
样例输入 Sample Input
10 3
3 5
2 8
1 5
样例输出 Sample Output
7
3
2
数据范围及提示 Data Size & Hint
30%的数据满足N,M<=5,000
60%的数据满足N,M<=100,000
100% 的数据满足1<=L<=R<=N<=500,000,1<=M<=500,000
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 #define MAXN 500100 7 int n,m; 8 int sum[MAXN<<2]; 9 int col[MAXN<<2]; 10 11 void putup(int rt) 12 { 13 sum[rt] = sum[rt<<1] + sum[rt<<1|1]; 14 } 15 void putdown(int rt,int m) 16 { 17 if (col[rt]) 18 { 19 col[rt<<1] = col[rt<<1|1] = col[rt]; 20 sum[rt<<1] = 0; 21 sum[rt<<1|1] = 0; 22 col[rt] = 0; 23 } 24 } 25 void build(int l,int r,int rt) 26 { 27 if (l==r) 28 { 29 sum[rt] = 1; 30 return ; 31 } 32 int m = (l+r)>>1; 33 build(lson); 34 build(rson); 35 putup(rt); 36 } 37 void update(int l,int r,int rt,int L,int R) 38 { 39 if (L<=l && r<=R) 40 { 41 col[rt] = 1; 42 sum[rt] = 0; 43 return ; 44 } 45 putdown(rt,r-l+1); 46 int m = (l+r)>>1; 47 if (L<=m) update(lson,L,R); 48 if (R>m) update(rson,L,R); 49 putup(rt); 50 } 51 int main() 52 { 53 while (scanf("%d%d",&n,&m)!=EOF) 54 { 55 build (1,n,1); 56 while (m--) 57 { 58 int x,y; 59 scanf("%d%d",&x,&y); 60 if (y<x) swap(x,y); 61 update(1,n,1,x,y); 62 printf("%d ",sum[1]); 63 } 64 } 65 return 0; 66 }