microchip @ 2023-06-27 16:35:24
尝试用st表,一开始用cin和cout导致3个点1.01s超时
然后试了试用scanf和printf,就RE了
如果不是越界,还有什么问题呢
如果你建议我用单调队列......我不会QAQ
代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,a[1000050],st[1000050][20],LOG[1000050];
int pow(int A,int B){
int ret=1;
while(B--){
ret*=A;
}return ret;
}
int find_min(int A,int B){
return min(st[A][LOG[B-A+1]],st[B-pow(2,LOG[B-A+1])+1][LOG[B-A+1]]);
}
int find_max(int A,int B){
return max(st[A][LOG[B-A+1]],st[B-pow(2,LOG[B-A+1])+1][LOG[B-A+1]]);
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=0;j<=log2(n);j++){
st[i][j]=99999999;
}
}
for(int i=1;i<=n;i++){
cin>>a[i];
st[i][0]=a[i];
LOG[i]=log2(i);
}for(int j=1;j<=LOG[n];j++)
for(int i=1;i<=n;i++)
st[i][j]=min(st[i][j-1],st[i+pow(2,j-1)][j-1]);
for(int i=1;i<=n-k+1;i++){
cout<<find_min(i,i+k-1)<<' ';
}cout<<endl;
for(int i=1;i<=n;i++){
for(int j=0;j<=log2(n);j++){
st[i][j]=-99999999;
}
}for(int i=1;i<=n;i++){
st[i][0]=a[i];
}for(int j=1;j<=LOG[n];j++)
for(int i=1;i<=n;i++)
st[i][j]=max(st[i][j-1],st[i+pow(2,j-1)][j-1]);
for(int i=1;i<=n-k+1;i++){
cout<<find_max(i,i+k-1)<<' ';
}
return 0;
}
by microchip @ 2023-06-27 17:33:15
不太懂为什么一定要把st开到[1500000][20]才不会越界
by whssy @ 2023-08-13 21:47:40
st表不慢 https://www.luogu.com.cn/record/120730766 @microchip