RMQ,两个点MLE,求滚动数组优化(st表)
查看原帖
RMQ,两个点MLE,求滚动数组优化(st表)
120136
一个简单名字楼主2021/9/11 16:20
听说滚动数组优化可以过,请大佬指教(现80分两个点MLE)
/*
记得检查代码
写完记得对拍
模数不要取错
多造数据卡自己(雾
能得的分不要让他跑掉啦!
*/
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=2000001;
int f[maxn][20],lg[maxn];
int n,m;
int l=1;
int r=m+1;
void produce_log()
{
	for(int i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
}
void RMQ()
{
for(int j=1;j<=lg[n];j++)
for(int i=1;i<=n-(1<<j)+1;i++)
f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
int query(int i)
{
int cha;
if(i-1<=m)
{
cha=lg[i-1];
return min(f[1][cha],f[i-(1<<cha)][cha]);
}
   l++,r++;
  cha=lg[r-l];
return min(f[l][cha],f[r-(1<<cha)][cha]);
}
int main()
{
	lg[1]=0;
	scanf("%d%d",&n,&m);
        r=m+1;
	for(int i=1;i<=n;i++)
	  scanf("%d",&f[i][0]);
        produce_log();
	RMQ();
	printf("0\n");
	for(int i=2;i<=n;i++)
	  printf("%d\n",query(i));
	return 0;
}
2021/9/11 16:20
加载中...