蒟蒻只想到线段树的解法,但是交上去却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;
}