海报PLA (HYSBZ - 1113)单调栈模板

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

                             



先解释下题意,题目说的不是很清楚

看上面两幅图,是样例的排列方式,其中可以发现有一个隐藏条件,空白不能被覆盖(我刚开始看到题目以为一大张糊上去就可以了……)

当遇到一低一高时,必须要用两张,但如果后面有一个和第一张高度相等的,三张海报,两张就覆盖了----省了一张

但如果一高一低,无论如何都省不了,再于后面就无关了

因此:

我们用一个单调栈,宽度不管,就看高度

小的入栈,大的不管,如果相等,可省一张

代码如下:

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[250001],stk[250001],top,n,k;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        int d,h;
        scanf("%d%d",&d,&h);
        while(top>0 && h<=stk[top]){
            if(h==stk[top]) k++;
            top--;
        }
        stk[++top]=h;
    }
    printf("%d",n-k);
    return 0;
}

原文地址:https://www.cnblogs.com/qseer/p/9402442.html

时间: 2024-10-09 17:12:16

海报PLA (HYSBZ - 1113)单调栈模板的相关文章

单调栈模板题 luogu P2659

题目链接:https://www.luogu.org/problem/P2659 实际上就是要我们求出每个数字左右两边第一个小于它的数字位置,然后两个位置所在的开区间长度乘以这个数字,取最大值输出. 因为是求两边第一个小于a[i]的数字,所以我们弄一个递增(其实是不减小就可以了,可以有相同大小的元素)的单调栈,从栈底到栈顶的数字是依次增大的,在求的过程中要始终保持递增的性质.我们每次在数字入栈时求出数字左边第一个小于它的数字位置,在出栈的时候求出右边第一个小于它的数字位置,为什么是这样,看下面,

BZOJ1113 海报PLA

好像是很古老的题?现在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行,每

[51nod1102]面积最大的矩形(单调栈||预处理)

题意:求序列上某区间最小值乘区间长度的最大值. 解题关键:很早就在<挑战程序设计竞赛>中见过了,单调栈模板题,注意弹栈时如何处理后面的元素. 法一:单调栈 #include<bits/stdc++.h> using namespace std; typedef long long ll; stack<int>s; ll a[50002]; int main(){ int n; cin>>n; for(int i=0;i<n;i++) cin>&g

【单调栈】【bzoj1113】海报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 题解:单调栈的水题,维护一个递增的单调栈,退栈时如果遇到相等,就代表可以少用一张海报. #i

$bzoj1113-POI2008$ 海报$PLA$ 单调栈

题面描述 \(N\)个矩形,排成一排. 现在希望用尽量少的矩形海报\(Cover\)住它们. 输入格式 第一行给出数字\(N\),代表有\(N\)个矩形.\(N\)在\([1,25*10^4]\) 下面\(N\)行,每行给出矩形的长与宽.其值在\([1,10^9]\) 输出格式 最少数量的海报数. 题解 维护单调减的单调栈,如果存在两个柱子高度相等,且他们中间的所有柱子都大于他们的高度,那么这两个柱子就可以用同一个海报覆盖 #include<iostream> #include<cstd

BZOJ 1113: [Poi2008]海报PLA

题目 1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MB 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 Sa

【BZOJ 1113】 [Poi2008]海报PLA

1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 751  Solved: 453 [Submit][Status] Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值在[1,1000000000]2 1/2 Postering Output 最少数量的海报数

1113: [Poi2008]海报PLA

1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 765  Solved: 466[Submit][Status][Discuss] Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值在[1,1000000000]2 1/2 Postering Output 最

数据结构之单调栈单调队列模板

单调栈 int rear=0; for(int st=1;st<=N;st++) { while(rear>0&&H[que[rear]]>=H[st]) --rear; if(rear==0) le[st]=0; else le[st]=que[rear]; que[++rear]=st; } 单调队列 int que[maxn],elem[maxn]; int front=1,rear=0; for(int i=1;i<K;i++) { while(rear&g