首页 > 代码库 > bzoj 1113 海报pla

bzoj 1113 海报pla

Description

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

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

技术分享

技术分享

【解析】

单调增栈。

显然贴海报只与矩形的高有关。发现当两个矩形高相同并且这两个矩形之间的矩形的高度都比他们大时可以用一张海报。

否则增加一张海报。

我们维护一个单调增栈,那么栈中的每一个元素左边的第一个元素就是第一个小于或者是等于当前元素的元素。判断是否相等,不相等就必须为当前

矩形增加一个海报。

【code】

#include<iostream>
#include<cstdio>
using namespace std;
#define N 250005
int n,top,ans,l,h;
int sta[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&l,&h);
        while(top&&sta[top]>h)top--;
        sta[++top]=h;
        if(sta[top-1]!=sta[top])ans++;
    }
    printf("%d",ans);
    return 0;
}

 

bzoj 1113 海报pla