st表求调
查看原帖
st表求调
241838
microchip楼主2023/6/27 16:35

尝试用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;
}
2023/6/27 16:35
加载中...