杨思越
(灵珠敖丙)
1
ST表模板题
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100005];
int f[100005][20];
int query(int l,int r){
int g=log2(r-l+1);
return max(f[l][g],f[r-(1<<g)+1][g]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i][0]=a[i];
}
int lgn=log2(n);
for(int j=1;j<=lgn;j++){
for(int i=1;i<=n;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
while(m--){
int l,r;
cin>>l>>r;
cout<<query(l,r)<<endl;
}
return 0;
}
/*
*/
桑沫严
(桑沫严)
10
改成
for(int i=1;i<=n-(1<<lgn)+1;i++)
遍历位置不对,
for(int i=1;i+(1<<k)-1<=n;i++)
360病毒
(只会打暴力的人)
14
循环改改,外层循环改成
for(int i=1;i<=n-(1<<j)+1;i++)
试试?
杨思越
(灵珠敖丙)
15

好好好,只能输出9了QWQ
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100005];
int f[100005][317];
int query(int l,int r){
int g=log2(r-l+1);
return max(f[l][g],f[r-(1<<g)+1][g]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i][0]=a[i];
}
int lgn=log2(n);
for(int j=1;j<=lgn;j++){
for(int i=1;i<=n-(1<<lgn)+1;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
while(m--){
int l,r;
cin>>l>>r;
cout<<query(l,r)<<endl;
}
return 0;
}
/*
*/
360病毒
(只会打暴力的人)
17
不是这样改的,应该改成
for(int i=1;i<=n-(1<<j)+1;i++)
可能就对了?(我也不清楚)
杨思越
(灵珠敖丙)
20
TLE30pts
对的还是前三个

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100005];
int f[100005][20];
int query(int l,int r){
int g=log2(r-l+1);
return max(f[l][g],f[r-(1<<g)+1][g]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i][0]=a[i];
}
int lgn=log2(n);
for(int j=1;j<=lgn;j++){
for(int i=1;i<=n-(1<<j)+1;i++){
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
while(m--){
int l,r;
cin>>l>>r;
cout<<query(l,r)<<endl;
}
return 0;
}
/*
*/