luogu 3467 [POI2008]PLA-Postering 单调栈

题目描述: 

Description

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

Input

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

Output

最少数量的海报数.

 

 

题解:

我们考虑按高度从小到大依次消去.

可以证明,如果当前块的高度最小,那么尽可能地向左右延申一定会得到最优解.

用单调栈维护连续的高度即可

Code:

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin) 
#define ll long long 
using namespace std; 
ll sta[300000],x,y; 
int main(){
    int n,tp=0;   scanf("%d%lld%lld",&n,&x,&y); 
    sta[++tp]=y;  
    int ans=n;  
    for(int i=1;i<=n-1;++i){
        scanf("%lld%lld",&x,&y); 
        while(y<sta[tp]&&tp>0) --tp;  
        if(tp && sta[tp]==y) --ans;  
        sta[++tp]=y; 
    }
    printf("%d",ans); 
    return 0; 
}

  

posted @ 2019-05-18 11:28  EM-LGH  阅读(163)  评论(0编辑  收藏  举报