1682. [HAOI2014]貼海報 ★★☆ 輸入文件:ha14d.in 輸出文件:ha14d.out 簡單對比 時間限制:1 s 記憶體限制:256 MB 【題目描述】 Bytetown城市要進行市長競選,所有的選民可以暢所欲言地對競選市長的候選人發表言論。為了統一管理,城市委員會為選民準備了一個 ...
1682. [HAOI2014]貼海報
★★☆ 輸入文件:ha14d.in
輸出文件:ha14d.out
簡單對比
時間限制:1 s
記憶體限制:256 MB
【題目描述】
Bytetown城市要進行市長競選,所有的選民可以暢所欲言地對競選市長的候選人發表言論。為了統一管理,城市委員會為選民準備了一個張貼海報的electoral牆。
張貼規則如下:
1.electoral牆是一個長度為N個單位的長方形,每個單位記為一個格子;
2.所有張貼的海報的高度必須與electoral牆的高度一致的;
3.每張海報以“A B”表示,即從第A個格子到第B個格子張貼海報;
4.後貼的海報可以覆蓋前面已貼的海報或部分海報。
現在請你判斷,張貼完所有海報後,在electoral牆上還可以看見多少張海報。
【輸入格式】
第一行: N M 分別表示electoral牆的長度和海報個數
接下來M行: Ai Bi 表示每張海報張貼的位置
【輸出格式】
輸出貼完所有海報後,在electoral牆上還可以看見的海報數。
【樣例輸入】
100 5
1 4
2 6
8 10
3 4
7 10
【樣例輸出】
4
【提示】
【約束條件】
1 0<= N <= 10000000 1<=M<=1000 1<= Ai <= Bi <=10000000
所有的數據都是整數。數據之間有一個空格
上來看了一眼立馬用10min打出了暴力,打完T3的暴力之後回來看了一下這個題感覺是線段樹的裸體
然後用15min寫出了線段樹
但是!!!
線段樹!!
居然!!
比!!
暴力!!
慢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
而且!!
還!!
爆記憶體!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
這就比較尷尬了,望著對拍程式上每次都是暴力先跑完然後線段樹等一秒再出結果的場景,我還能說什麼、、
難道是因為我寫的線段樹太醜了???
=.=
暴力思路:模擬張貼每一個海報
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 using namespace std;
6 const int MAXN=10000001;
7 int n,m,x,y;
8 int read(int & n)
9 {
10 char c='/';int x=0,flag=0;
11 while(c<'0'||c>'9')
12 {c=getchar();
13 if(c=='-')flag=1;}
14 while(c>='0'&&c<='9')
15 {x=x*10+c-48;c=getchar();}
16 if(flag)n=-x;
17 else n=x;
18 return n;
19 }
20 int a[MAXN];
21 int vis[MAXN];
22 int now=1;
23 int ans=0;
24 int main()
25 {
26 freopen("a.in","r",stdin);
27 freopen("b.out","w",stdout);
28 read(n);read(m);
29 for(int i=1;i<=m;i++)
30 {
31 read(x);read(y);
32 if(x>y)swap(x,y);
33 for(int j=x;j<=y;j++)
34 a[j]=i;
35 }
36 for(int i=1;i<=n;i++)
37 {
38 if(vis[a[i]]==0&&a[i]!=0)
39 {
40 ans++;
41 vis[a[i]]=1;
42 }
43 }
44 printf("%d",ans);
45 return 0;
46 }
正解:老師講了個掃描線但是沒聽懂啊,,,,,so參考了題解的浮水法
首先我們讀入每一個海報的l和r,
然後逆序掃描,預設ans為一,因為最後的一張一定能看見
對於每一個i一直向上枚舉,就像浮水一樣,如果經過不斷的裁剪之後能夠>n的話
ans++
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 using namespace std;
7 const int MAXN=1001;
8 int n,m,ans=1;
9 int vis[MAXN];
10 struct node
11 {
12 int l;
13 int r;
14 int id;
15 }a[MAXN];
16 int read(int & n)
17 {
18 char c='/';int flag=0,x=0;
19 while(c<'0'||c>'9')
20 {if(c=='-')flag=1;
21 c=getchar();}
22 while(c>='0'&&c<='9')
23 {x=x*10+(c-48);
24 c=getchar();}
25 if(flag)n=-x;
26 else n=x;
27 }
28 void water(int ll,int rr,int now,int pos)
29 {
30 if(vis[pos])
31 return ;
32 while(now<=m&&(rr<=a[now].l||ll>=a[now].r))
33 now++;
34 if(now>m)
35 {
36 vis[pos]=1;
37 ans++;
38 return ;
39 }
40 if(ll<a[now].l&&rr>a[now].l)
41 water(ll,a[now].l,now+1,pos);
42 if(rr>a[now].r&&ll<a[now].r)
43 water(a[now].r,rr,now+1,pos);
44
45 }
46 int main()
47 {
48 freopen("ha14d.in","r",stdin);
49 freopen("ha14d.out","w",stdout);
50 read(n);read(m);
51 for(int i=1;i<=m;i++)
52 {
53 read(a[i].l);
54 read(a[i].r);
55 a[i].r=a[i].r+1;
56 a[i].id=i;
57 }
58 for(int i=m-1;i>=1;i--)
59 {
60 water(a[i].l,a[i].r,i+1,i);
61 }
62 printf("%d",ans);
63 return 0;
64 }