我想用RMQ算法来O(1)找第一个区间最小值然后从那个最小值开始找下一个区间最小值,每一次取最小值的最大值,但是他wa50分,不知道是不是思路问题(题解给的是二分+dp)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010;
void fileopen(){
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
}
class RMQ {
private:
int n,logN;vector< vector< pair<int, int> > > st;
public:
RMQ(const vector<int>& arr) {
n=arr.size();
logN=log2(n)+1;
st.assign(logN,vector< pair<int,int> >(n));
for(int i=0;i<n;i++){
st[0][i]={arr[i],i};
}
for(int j=1;j<logN;j++){
for (int i=0;i+(1<<j)<=n;i++){
if(st[j-1][i].first<st[j-1][i+(1<<(j-1))].first){
st[j][i]=st[j-1][i];
}else{
st[j][i]=st[j-1][i+(1<<(j-1))];
}
}
}
}
pair<int,int> query(int left,int right){
int j=log2(right-left+1);
if(st[j][left].first<st[j][right-(1<<j)+1].first){
return st[j][left];
}else{
return st[j][right-(1<<j)+1];
}
}
};
void F(){
int n,l,r;
scanf("%lld%lld%lld",&n,&l,&r);
vector<int> arr(n,0);
for(int i=0;i<n;i++){
scanf("%lld",&arr[i]);
}
RMQ rmq(arr);
int i=0,minret=rmq.query(0,n-1).first;
while(i+r<n){
auto result=rmq.query(i+l,i+r);
minret=max(minret,result.first);
i=result.second;
}
printf("%lld\n",minret);
}
signed main(){
//fileopen();
int T;
scanf("%lld",&T);
while(T--){
F();
}
return 0;
}