题目描述
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 nn (1le nle 250 0001≤n≤250 000), denoting the number of buildings the chain comprises of.
Each of the following nn lines contains two integers d_idi and w_iwi (1le d_i,w_ile 1 000 000 0001≤di,wi≤1 000 000 000), separated by a single space, denoting respectively the length and height of the 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.
第一个为一个整数,表示最少需要几张海报.
输入输出样例
5
1 2
1 3
2 2
2 5
1 4
4
说明
题目简述:N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们.
感谢@__乱世魇华 提供翻译
思路:这个题目难在读题,用单调栈维护一下就好了。
#include<cstdio> #include<cstring> #include<algorithm> #define MAXN 250005 using namespace std; long long n,top,ans; long long a[MAXN],stack[MAXN]; int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++){ int x; scanf("%d%lld",&x,&a[i]); } for(int i=1;i<=n;i++){ while(top&&stack[top]>a[i]) top--; if(stack[top]==a[i]) ans++; stack[++top]=a[i]; } printf("%lld ",n-ans); return 0; }