P9275 题解
Solution
一道简单题,提供一种不需要脑子的做法。
首先题目问的是
然后考虑如果
所以对于每个数
那么考虑询问的时候,从
所以要么用
这个过程可以看做每个
复杂度
代码:
#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=2e5+10;
int n,nxt[MAXN][30],mx[MAXN][30],st[MAXN][30],a[MAXN],q;
stack<int> sts; int calc(int l,int r) {if(l>r) return 0;int k=log2(r-l+1);return max(st[l][k],st[r-(1<<k)+1][k]);}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n; ffor(i,1,n) cin>>a[i],st[i][0]=a[i];
ffor(k,1,20) for(int l=1,r=(1<<k);r<=n;l++,r++) st[l][k]=max(st[l][k-1],st[l+(1<<k-1)][k-1]);
a[n+1]=INT_MAX; sts.push(n+1);
ffor(i,0,21) nxt[n+1][i]=n+1;
roff(i,n,1) {
while(a[sts.top()]<a[i]) sts.pop();
nxt[i][0]=sts.top(),mx[i][0]=a[i]*calc(i+1,nxt[i][0]-1);
ffor(j,1,20) nxt[i][j]=nxt[nxt[i][j-1]][j-1],mx[i][j]=max(mx[i][j-1],mx[nxt[i][j-1]][j-1]);
sts.push(i);
}
cin>>q;
ffor(i,1,q) {
int l,r; cin>>l>>r;
int ans=0;
roff(j,20,0) if(nxt[l][j]<=r) ans=max(ans,mx[l][j]),l=nxt[l][j];
ans=max(ans,a[l]*calc(l+1,r));
cout<<ans<<'\n';
}
return 0;
}