P3467 [POI2008]PLA-Postering
题面
Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长的,从东向西延伸的建筑物链(建筑物的高度不一).Byteburg市的市长Byteasar,决定将这个建筑物链的一侧用海报覆盖住.并且想用最少的海报数量,海报是矩形的.海报与海报之间不能重叠,但是可以相互挨着(即它们具有公共边),每一个海报都必须贴近墙并且建筑物链的整个一侧必须被覆盖(意思是:海报需要将一侧全部覆盖,并且不能超出建筑物链)
输入格式
第一行为一个整数n(1≤n≤250000),表示有n个建筑,接下来n行中,第i行表示第i个建筑物的宽di与高wi(1≤di,wi≤1 000 000 000),中间由一个空格隔开
输出格式
第一个为一个整数,表示最少需要几张海报.
说明/提示
题目简述:N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们.
感谢@__乱世魇华 提供翻译
思路
维护单调递增栈,然后直接如果栈顶不是这个元素就计数器++就好了。
代码
#include <bits/stdc++.h>
using namespace std;
int n,sta[250005];
int height[250005];
int result=0,top=0;
void push(int i){
while(top>0 && height[i]<height[sta[top]]){
top--;
}
if(height[sta[top]]!=height[i]){
result++;
}
sta[++top]=i;
}
int main(){
cin>>n;
for(int i=1,width;i<=n;i++){
cin>>width>>height[i];
push(i);
}
cout<<result<<endl;
return 0;
}