好像是很古老的题?现在BZOJ上找不到该题,所以没有提交。
1113: [Poi2008]海报PLA
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 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
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 }