想问一下ST算法预处理的时候,dpmax[s][i]里关于s变量的循环条件的理解
查看原帖
想问一下ST算法预处理的时候,dpmax[s][i]里关于s变量的循环条件的理解
1186230
liwenliwenllll楼主2023/12/4 01:11

首先,这是AC代码:

#include <bits/stdc++.h>
using namespace std;
int dpmax[50005][22],dpmin[50005][22];
int LOG2[50005],a[50005];

void Get_log2(int n)//数组元素就代表log2几 
{
	LOG2[1] = 0;//log2(1)=0
	for(int i=2;i<=n;i++)
		LOG2[i] = LOG2[i / 2] + 1;
}

void Get_ans(int n)
{
	for(int s=1;s<=n;s++)//第一组,当区间长度为1(即2的零次方)时 
		dpmin[s][0] = dpmax[s][0] = a[s];

	int p = LOG2[n];//倍增法满足(2^p<=n)的最大次方 
	 
	for(int i=1;i<=p;i++) 
		for(int s=1;s+(1<<i)<=n+1;s++)//s+(1<<i)<=n则答案不一样,为什么 
		{
			dpmax[s][i] = max(dpmax[s][i-1],dpmax[s + (1 << (i-1))][i-1]);
			dpmin[s][i] = min(dpmin[s][i-1],dpmin[s + (1 << (i-1))][i-1]);
		}
}
int main()
{	
	int n,q; cin>>n>>q;
	Get_log2(n);//自己算log2(n) 
	for(int i=1;i<=n;i++)
		cin>>a[i];
	Get_ans(n);//ST算法的预处理 
	while(q--)
	{
		int a,b; cin>>a>>b;
		int k = LOG2[b - a + 1];
		int maxv = max(dpmax[a][k],dpmax[b-(1<<k)+1][k]);
		int minv = min(dpmin[a][k],dpmin[b-(1<<k)+1][k]);
		int ans = maxv - minv;
		cout<<ans<<endl;
	}
	return 0;
}

我所不理解的是上述代码中ST算法预处理(也就是Get_ans函数)中

	for(int i=1;i<=p;i++) 
		for(int s=1;s+(1<<i)<=n+1;s++)//s+(1<<i)<=n则答案不一样,为什么
		{
			dpmax[s][i] = max(dpmax[s][i-1],dpmax[s + (1 << (i-1))][i-1]);
			dpmin[s][i] = min(dpmin[s][i-1],dpmin[s + (1 << (i-1))][i-1]);
		}
}

我想了很久都没有想明白,我自己所想的是<=n就可以了,但是答案告诉我这是错的,一定得是<=n+1,求大佬解惑

2023/12/4 01:11
加载中...