BZOJ1113 海报PLA

好像是很古老的题?现在BZOJ上找不到该题,所以没有提交。

1113: [Poi2008]海报PLA

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 810  Solved: 507
[Submit][Status][Discuss]

Description

N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们.

(SilverN附注:矩形外不能贴海报)

Input

第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值在[1,1000000000]2 1/2 Postering

Output

最少数量的海报数.

Sample Input

5
1 2
1 3
2 2
2 5
1 4

Sample Output

4

根据神秘提示 可以用单调栈来处理。

先假设每个矩形都用一张海报覆盖。从左到右遍历,对于一个矩形,如果左边有和它高度相等的矩形(且两个矩形之间没有更低的),那么可以用一大张海报覆盖这两个矩形和它们之间的部分(见上图),则总海报数-- 。

用单调栈维护“左边第一个比当前矩形低的矩形”,如果该矩形高度和当前矩形相同,那么总海报数--

代码如下:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 using namespace std;
 5 int n;
 6 int st[2000];
 7 int t=0;
 8 int ans;
 9 int main(){
10     scanf("%d",&n);
11     ans=n;//最差情况需要n张海报 
12     int i,j;
13     int x,y;
14     scanf("%d%d",&x,&y);
15     st[++t]=y;
16     for(i=2;i<=n;i++){
17         scanf("%d%d",&x,&y);
18         while(t>0 && st[t]>y)t--;
19         if(st[t]==y)ans--;
20         st[++t]=y;
21     }
22     printf("%d
",ans);
23     return 0;
24 
25 }
原文地址:https://www.cnblogs.com/SilverNebula/p/5550631.html