[POI2008] PLA-Postering
题目描述
All the buildings in the east district of Byteburg were built in accordance with the old arbitecture:
they stand next to each other with no spacing inbetween.
Together they form a very long chain of buildings of diverse height, extending from east to west.
The mayor of Byteburg, Byteasar, has decided to have the north face of the chain covered with posters.
Byteasar ponders over the minimum number of posters sufficient to cover the whole north face.
The posters have rectangular shape with vertical and horizontal sides.
They cannot overlap, but may touch each other, i.e. have common points on the sides.
Every poster has to entirely adjoin the walls of certain buildings and the whole surface of the north face has to be covered.
Task Write a programme that:
reads the description of buildings from the standard input, determines the minimum number of posters needed to entirely cover their north faces, writes out the outcome to the standard output.
Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长的,从东向西延伸的建筑物链(建筑物的高度不一).Byteburg市的市长Byteasar,决定将这个建筑物链的一侧用海报覆盖住.并且想用最少的海报数量,海报是矩形的.海报与海报之间不能重叠,但是可以相互挨着(即它们具有公共边),每一个海报都必须贴近墙并且建筑物链的整个一侧必须被覆盖(意思是:海报需要将一侧全部覆盖,并且不能超出建筑物链)
输入格式
The first line of the standard input contains one integer n n n ( 1 ≤ n ≤ 250 000 1\le n\le 250\ 000 1≤n≤250 000), denoting the number of buildings the chain comprises of.
Each of the following n n n lines contains two integers d i d_i di and w i w_i wi ( 1 ≤ d i , w i ≤ 1 000 000 000 1\le d_i,w_i\le 1\ 000\ 000\ 000 1≤di,wi≤1 000 000 000), separated by a single space, denoting respectively the length and height of the i t h i^{th} ith building in the row.
第一行为一个整数n(1≤n≤250000),表示有n个建筑,接下来n行中,第i行表示第i个建筑物的宽di与高wi(1≤di,wi≤1 000 000 000),中间由一个空格隔开
输出格式
The first and only line of the standard output should contain one integer, the minimum number of rectangular posters that suffice to cover the north faces of the buildings.
第一个为一个整数,表示最少需要几张海报.
样例 #1
样例输入 #1
5
1 2
1 3
2 2
2 5
1 4
样例输出 #1
4
提示
题目简述:N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们.
感谢@__乱世魇华 提供翻译
思路分析
这道题如果按常理去想的话,我们可以想到,对于两个柱子,如果一个比另一个高的话,那么我们就得多拿一张纸来覆盖,因此,多举几个例子我们可以发现,我们可以开一个栈,存楼的高度,如果栈不为空并且能够覆盖下一栋楼时,就将栈里的元素弹出,直到不能再覆盖的楼的。如果可以新开的话,就答案加1,继续查询能否覆盖,别忘记无论如何都要存下这栋楼的高度。简而言之:当前高度不能覆盖前面的高度的时候,则开一张
代码
//栈
#include<iostream>
#include<stack>
using namespace std;
const int N = 250010;
stack<int> s;
int h[N],w[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>w[i]>>h[i];
int res=0;
for(int i=1;i<=n;i++){
while(!s.empty()&&s.top()>h[i]){
s.pop();
}
if(s.empty()||s.top()!=h[i]){
res++;
}
s.push(h[i]);
}
cout<<res;
return 0;
}