蒟蒻80分求助
查看原帖
蒟蒻80分求助
158089
zxqwq楼主2020/9/16 17:17

这个期望O(1)O(1) 的 RMQ 会WA啊

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<algorithm>

//#define int long long

using namespace std;

const int maxn=2e6+20;

int mmx[maxn/20],lx[maxn],rx[maxn],a[maxn];
int st[maxn/20][24];
int _log2[maxn];
int n,m,s,len,ans;

void fsol()
{
	len=max(_log2[n],3);
	//len=1;
	//len=max(3ll,(int)sqrt(n));
	int sz=(n-1)/len+1;
	register int i,j;
	for(i=1;i<=sz;i++)
	{
		rx[i*len]=a[i*len];
		lx[(i-1)*len+1]=a[(i-1)*len+1];
		for(j=1;j<len;j++) rx[i*len-j]=max(a[i*len-j],rx[i*len-j+1]);
		for(j=len-2;j>=0;j--) lx[i*len-j]=max(a[i*len-j],lx[i*len-j-1]);
		mmx[i]=rx[(i-1)*len+1];
	}
	for(i=1;i<=sz;i++) st[i][0]=mmx[i];
	for(j=1;(1<<j)<=sz;j++)
	for(i=1;i<=sz;i++)
	{
		st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
	}
	return ;
}

int stans(int l,int r)
{
	if(r<l) return 0;
	return max(st[l][_log2[r-l+1]],st[r-(1<<(_log2[r-l+1]))+1][_log2[r-l+1]]);
}

int getans(int l,int r)
{
	int lb,rb;
	lb=(l-1)/len+1;
	rb=(r-1)/len+1;
	int ansmax=0;
	if(lb==rb)
	{
		register int i;
		for(i=l;i<=r;i++) ansmax=max(ansmax,a[i]);
		return ans;
	}
	ansmax=max(rx[l],lx[r]);
	ansmax=max(ansmax,stans(lb+1,rb-1));
	return ansmax;
}

signed main()
{
	//ios::sync_with_stdio(false);
	register int i,j;
	//cin>>n>>m>>s;
	//cin>>n>>m;
	scanf("%d %d",&n,&m);
	//srand(s);
	_log2[0]=-1;
	//for(i=1;i<=n;i++) a[i]=read(),_log2[i]=_log2[i>>1]+1;
	for(i=1;i<=n;i++) scanf("%d",&a[i]),_log2[i]=_log2[i>>1]+1;
	fsol();
	int l,r;
	for(i=1;i<=m;i++)
	{
		scanf("%d %d",&l,&r); 
		//cin>>l>>r;
		//l=read()%n+1,r=rand()%n+1;
		if(l>r) swap(l,r);
		//cout<<getans(l,r)<<endl;;
		printf("%d\n",getans(l,r));
		//ans+=getans(l,r);
	}
	//cout<<ans<<endl;
	return 0;
}

2020/9/16 17:17
加载中...