关于st表的log问题
查看原帖
关于st表的log问题
557887
acahv楼主2022/7/2 20:43

本题中,如果初始化

void pre()
{
	logn[1]=0,logn[2]=1;
	for(int i=3;i<maxn;i++)
		logn[i]=logn[i/2]+1;
}

之后再调用 s=logn[rl+1];s=logn[r-l+1]; 就会re,然而直接采用

double ss=log(r-l+1)/log(2.0);
int s=ss;

就能通过,这是为什么呢,我想了很久没有想到原因

完整代码(RE版本):

#include<bits/stdc++.h>
using namespace std;
const int maxn=200020,lgn=22;
long long m,d,t,f[maxn][lgn],logn[lgn],cnt;
void pre()
{
	logn[1]=0,logn[2]=1;
	for(int i=3;i<maxn;i++)
		logn[i]=logn[i/2]+1;
}
void insert(int x)
{
	f[++cnt][0]=x;
	for(int i=1;cnt-(1<<i)>=0;i++)
			f[cnt][i]=max(f[cnt][i-1],f[cnt-(1<<(i-1))][i-1]);
}
long long find(int num)
{
	int l=cnt-num+1,r=cnt;
	int s=logn[r-l+1];
	long long ans=max(f[r][s],f[l+(1<<s)-1][s]);
	return ans;
}
int main()
{
	cin>>m>>d;
	pre();
	for(int i=1;i<=m;i++){
		char a;
		long long num;
		cin>>a>>num;
		if(a=='A')
		{
			long long op=(num+t)%d;
			insert(op);
		}
		else{
			long long ans=find(num);
			cout<<ans<<endl;
			t=ans;
		}
	}
	return 0;
}
2022/7/2 20:43
加载中...