输出一个整数,表示城市中最少包含的建筑物数量
Silver
仔细想想这道题里的w和x是没有意义的,所以直接忽略掉好了...
然后用单调栈寻找每个楼右边第一个高度小于等于它的,判断两者是否相等,如果相等答案数减1。
注意高度为0的楼要特殊处理。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define F(i,j,n) for(int i=j;i<=n;i++) #define D(i,j,n) for(int i=j;i>=n;i--) #define pa pair<int,int> #define LL long long #define MAXN 50005 int n,w,x,y,top=0,ans=0,a[MAXN]; int read() { int ret=0,flag=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') flag=-1;ch=getchar();} while (ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();} return ret*flag; } int main() { // freopen("input.in","r",stdin); n=read();w=read(); F(i,1,n) { x=read();y=read(); if (y) ans++; while (top&&a[top]>=y) { if (y&&a[top]==y) ans--; top--; } a[++top]=y; } printf("%d\n",ans); }