我怕不是睿智一开始写了个线段树WA- -不知WA在哪。
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; #define lson(a) a<<1 #define rson(a) a<<1|1 typedef long long ll; const ll maxn=250010; ll w[maxn],h[maxn],sum[maxn*4],lazy[maxn*4]; ll sta[maxn],f[maxn]; void pushdown(ll k){ sum[k]=sum[lson(k)]+sum[rson(k)]; } void pushlazy(ll k,ll l,ll r){ if(lazy[k]){ ll mid=(l+r)>>1,s=lazy[k]; sum[lson(k)]=s*(mid-l+1); sum[rson(k)]=s*(r-mid); lazy[lson(k)]=s;lazy[rson(k)]=s; lazy[k]=0; } } ll find(ll k,ll l,ll r,ll p){ pushlazy(k,l,r); if(l==r){ return sum[k]; } ll mid=(l+r)>>1; if(mid>=p)return find(lson(k),l,mid,p); else return find(rson(k),mid+1,r,p); } void change(ll k,ll l,ll r,ll tl,ll tr,ll s){ pushlazy(k,l,r); if(tl<=l&&tr>=r){ sum[k]=s*(r-l+1); lazy[k]=s; return ; } ll mid=(l+r)>>1; if(mid>=tl)change(lson(k),l,mid,tl,tr,s); if(mid<tr)change(rson(k),mid+1,r,tl,tr,s); pushdown(k); } int main(){ ll n,top=0,ans=0;; scanf("%lld",&n); for(ll i=1;i<=n;++i)scanf("%lld%lld",&w[i],&h[i]); sta[0]=n+1; for(ll i=n;i>=1;--i){ while(top&&h[sta[top]]>=h[i])top--; f[i]=sta[top]-1; sta[++top]=i; } for(ll i=1;i<=n;++i){ if(i==1||find(1,1,n,i)<h[i]){ ++ans; change(1,1,n,i,f[i],h[i]); } } printf("%lld",ans); return 0; }
最后发线是个睿智单调栈题目。。。
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long top=0,n,num=0,i,j,k,stack[250100]; int main(){ scanf("%lld",&n); for(i=1;i<=n;++i){ scanf("%lld%lld",&j,&k); while(top>0&&k<=stack[top]){ if(k==stack[top])num++; --top; } stack[++top]=k; } printf("%lld\n",n-num); return 0;