1628: [Usaco2007 Demo]City skyline
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 555 Solved: 432
[ Submit][ Status][ Discuss]
Description
Input
第一行给出N,W
第二行到第N+1行:每行给出二个整数x,y,输入的x严格递增,并且第一个x总是1
Output
输出一个整数,表示城市中最少包含的建筑物数量
Sample Input
10 26
1 1
2 2
5 1
6 3
8 1
11 0
15 2
17 3
20 2
22 1
INPUT DETAILS:
The case mentioned above
1 1
2 2
5 1
6 3
8 1
11 0
15 2
17 3
20 2
22 1
INPUT DETAILS:
The case mentioned above
Sample Output
6
HINT
Source
Silver
题解:单调栈。。。首先我们可以肯定的是答案的上限 肯定是 n, 何时会减一呢? 当有两座楼高度相等且它们的中间没有比它们低的楼。所以要维护的是一个单调递增的序列, 每次弹出比它大的直到遇到一个和它相等的, 没有相等的话就把 它加入这个序列中。
代码实现也很简单啊。。。
#include<cstdio>
using namespace std;
const int maxn=50001;
int n,m,top,ans;
int a[maxn],s[maxn];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
n=read();m=read();
ans=n;
for(int i=1;i<=n;i++)
a[i]=read(),a[i]=read();
for(int i=1;i<=n;i++)
{
while(s[top]>a[i])top--;
if(s[top]==a[i])ans--;
else s[++top]=a[i];
}
printf("%d\n",ans);
return 0;
}