像某个
下面主要以
先要
只需要
然后就是预处理。可以得到一个
等式右边的两项可以通过刚刚的方法求得。
这样就可以开始推导推导了:设
理由如上。
查询操作。
其中
理由还是如上。
吸取了某个叫
上代码。
// here is Init
void init(){
lg[0]=-1;
FOR(i,1,n) lg[i]=lg[i>>1]+1;
FOR(i,1,n) dp[i][0]=a[i];
int lim=lg[n];
FOR(k,1,lim)
FOR(s,1,n+1-(1<<k))
dp[s][k]=max(dp[s][k-1],dp[s+(1<<(k-1))][k-1]);
}
// here is Query
l=read();r=read();
int k=lg[r-l+1];
cout<<max(dp[l][k],dp[r-(1<<k)+1][k])<<'\n';
那么除了