社区讨论

ST模版,玄关

P3865【模板】ST 表 & RMQ 问题参与者 3已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@m4mmpo3q
此快照首次捕获于
2024/12/13 18:52
去年
此快照最后确认于
2025/11/04 23:22
4 个月前
查看原帖
rt,
CPP
#include<bits/stdc++.h>
using namespace std;
const int MN=2*1e6+1;
int f[MN][20];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int pw[21];
inline void cpw(){
	pw[0]=1;
	for(int i=1;i<=20;i++)
	{
		pw[i]=pw[i-1]*2;
	}
	return ;
}
int lg[MN];
inline void clg(){
	lg[1]=0;
	for(int i=2;i<=MN;i++)
	{
		lg[i]=pw[(int)log2(i)];
	}
	return ;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cpw();
	clg();
	int n=read(),m=read();
	int a[n+1];
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		f[i][0]=a[i];
	}
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i<=n;i++)
		{
			if(i+pw[j]-1<=n)
			{
				f[i][j]=max(f[i][j-1],f[i+pw[j-1]][j-1]);
			}
		}
	}
	for(int i=1,x,y;i<=m;i++)
	{
		x=read();
		y=read();
		int t=lg[y-x];
        int p1=f[x][t];
        int p2=f[y-pw[t]+1][t];
        cout<<max(p1,p2)<<endl;
	}
	return 0;
 } 
样例没过,求改(应该是状态转移方程的问题)

回复

12 条回复,欢迎继续交流。

正在加载回复...