1191 数轴染色

1191 数轴染色

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 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 using namespace std;
 3 
 4 int n,m,tree[800100],x,y;
 5 
 6 void build(int x,int l,int r)        //建树
 7 {
 8     if (l==r)
 9     {
10         tree[x]=1;
11         return;
12     }
13     int m=(l+r)/2;
14     build(x*2,l,m);
15     build(x*2+1,m+1,r);
16     tree[x]=tree[x*2]+tree[x*2+1];
17 }
18 
19 void change(int x,int l,int r,int ql,int qr)      //单点修改
20 {
21     if (l>qr||r<ql||tree[x]==0) return;
22     if (l>=ql&&r<=qr) 
23     {
24         tree[x]=0;
25         return;
26     }
27     int m=(l+r)/2;
28     change(x*2,l,m,ql,qr);
29     change(x*2+1,m+1,r,ql,qr);
30     tree[x]=tree[x*2]+tree[x*2+1];
31     return;
32 }
33 
34 int main()
35 {
36     scanf("%d%d",&n,&m);
37     build(1,1,n);
38     for (int i=1; i<=m; i++)
39     {
40         scanf("%d%d",&x,&y);
41         change(1,1,n,x,y);
42         printf("%d
",tree[1]);             //直接输出和
43     }
44     return 0;
45 }
原文地址:https://www.cnblogs.com/mjtcn/p/7066402.html