BZOJ1113: [Poi2008]海报PLA

我怕不是睿智一开始写了个线段树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;

猜你喜欢

转载自www.cnblogs.com/Dream-Runner/p/9402007.html
今日推荐