开开心心线段树,快快乐乐TLE力(悲)
查看原帖
开开心心线段树,快快乐乐TLE力(悲)
704785
Char__楼主2022/7/29 17:10

蒟蒻只想到线段树的解法,但是交上去却TLE了,有大佬可以看看代码有什么错误或者提供一下更好的思路吗,蟹蟹!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=4000005;
const ll mod=998244353;
const ll inf=0x3f3f3f3f;

ll n,m,v[maxn],t1[maxn*4],t2[maxn*4];
ll ls(ll p){
    return p<<1;
}
ll rs(ll p){
    return p<<1|1;
}
void pushup(ll p){
    t1[p]=max(t1[ls(p)],t1[rs(p)]);
    t2[p]=min(t2[ls(p)],t2[rs(p)]);
}
void build(ll l,ll r,ll p){
    if(l==r){
        t1[p]=v[l];
        t2[p]=v[l];
//cout<<l<<" "<<r<<" "<<t1[p]<<" "<<t2[p]<<endl;
        return;
    }
    ll mid=(l+r)>>1;
    build(l,mid,ls(p));
    build(mid+1,r,rs(p));
    pushup(p);
//cout<<l<<" "<<r<<" "<<t1[p]<<" "<<t2[p]<<endl;
}
ll q1(ll ql,ll qr,ll l,ll r,ll p){//查询区间最大
    if(l>=ql&&r<=qr)
        return t1[p];
    ll ans=-inf;
    ll mid=(l+r)>>1;
    if(mid>=ql)
        ans=max(ans,q1(ql,qr,l,mid,ls(p)));
    if(mid<qr)
        ans=max(q1(ql,qr,mid+1,r,rs(p)),ans);
    return ans;
}
ll q2(ll ql,ll qr,ll l,ll r,ll p){//查询区间最小
    if(l>=ql&&r<=qr){
        return t2[p];
    }
    ll ans=inf;
    ll mid=(l+r)>>1;
    if(mid>=ql)
        ans=min(q2(ql,qr,l,mid,ls(p)),ans);
    if(mid<qr)
        ans=min(q2(ql,qr,mid+1,r,rs(p)),ans);
    return ans;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    build(1,n,1);
    ll ans=-inf;
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
//cout<<i<<" "<<j<<" "<<q1(i,j,1,n,1)<<" "<<q2(i,j,1,n,1)<<" "<<ans<<endl;
            ans=max(ans,(q1(i,j,1,n,1)-q2(i,j,1,n,1)-j+i-1));
        }
    }
    cout<<ans<<endl;
    return 0;
}

2022/7/29 17:10
加载中...