生活随笔
收集整理的這篇文章主要介紹了
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\n",tree[
1]);
//直接輸出和
43 }
44 return 0;
45 }
?
轉載于:https://www.cnblogs.com/mjtcn/p/7066402.html
總結
以上是生活随笔為你收集整理的1191 数轴染色的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。