rmq区间最值

时间复杂度O(NlogN)+O(Q)

int a[N];
int dpmax[N][20],dpmin[N][20];
void first(int n)
{
	mm(dpmax,0);
	mm(dpmin,0);
	rep(i,1,n+1)
	{
		dpmin[i][0]=dpmax[i][0]=a[i];
	}
	for(int j=1;(1<<j)<=n;j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
			dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<(j-1))][j-1]);
		}
	}
}
int fmax(int l,int r)
{
	int x=0;
	while(l-1+(1<<x)<=r) x++;
	x--;
	return max(dpmax[l][x],dpmax[r-(1<<x)+1][x]);
}
int fmin(int l,int r)
{
	int x=0;
	while(l-1+(1<<x)<=r) x++;
	x--;
	return min(dpmin[l][x],dpmin[r-(1<<x)+1][x]);
}
posted @ 2018-09-04 20:20  一无所知小白龙  阅读(137)  评论(0编辑  收藏  举报