The city in profile is quite dull architecturally, featuring only box-shaped buildings. The skyline of a city on the horizon is somewhere between 1 and W units wide (1 <= W <= 1,000,000) and described using N (1 <= N <= 50,000) successive x and y coordinates (1 <= x <= W, 0 <= y <= 500,000), defining at what point the skyline changes to a certain height.
An example skyline could be:
..........................
.....XX.........XXX.......
.XXX.XX.......XXXXXXX.....
XXXXXXXXXX....XXXXXXXXXXXX
and would be encoded as (1,1), (2,2), (5,1), (6,3), (8,1), (11,0), (15,2), (17,3), (20,2), (22,1).
This skyline requires a minimum of 6 buildings to form; below is one possible set of six buildings whose could create the skyline above:
.......................... ..........................
.....22.........333....... .....XX.........XXX.......
.111.22.......XX333XX..... .XXX.XX.......5555555.....
X111X22XXX....XX333XXXXXXX 4444444444....5555555XXXXX
..........................
.....XX.........XXX.......
.XXX.XX.......XXXXXXX.....
XXXXXXXXXX....666666666666
* Lines 2..N+1: Two space separated integers, the x and y coordinate of a point where the skyline changes. The x coordinates are presented in strictly increasing order, and the first x coordinate will always be 1.
10 26 1 1 2 2 5 1 6 3 8 1 11 0 15 2 17 3 20 2 22 1
6
The case mentioned above
题意:以坐标的形式给出一张图,表示一些楼房的正视图,求出楼房的最少个数。
思路:维护一个递增的单调栈,如果当前栈顶元素大于要入栈的元素,那么此时该栈顶元素可能延伸的位置就
已经确定了,因为比它低的点的正视图 不能再被该栈顶元素覆盖 否则其坐标不会比其低,然后每pop一次
就增加一个楼;
#include<iostream>
#include<cstdio>
#include<stack>
#define N 50010
using namespace std;
int y[N],n,w,x;
int main(){
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++)
scanf("%d%d",&x,&y[i]);
stack<int>st;
while(!st.empty())
st.pop();
st.push(0);
y[0]=0;
y[n+1]=0;
int ans=0;
for(int i=1;i<=n+1;i++)
{ while(st.empty()==0&&y[st.top()]>y[i])
{
st.pop();
ans++;
}
if(y[i]!=y[st.top()])
st.push(i);
}
printf("%d",ans);
return 0;
}