社区讨论

ST 0分 线段树 93分差十多毫秒 求条

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

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@mivw5iys
此快照首次捕获于
2025/12/07 23:42
2 个月前
此快照最后确认于
2025/12/11 09:00
2 个月前
查看原帖
ST
CPP
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
const int LOG=17;

int st[N][LOG]={},lg2[N]={},arr[N]={};

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;
}

void make_log(int n){
	lg2[1]=0;
	for(int i=2;i<=n;i++){
		lg2[i]=lg2[i/2]+1;
	}
	return ;
}

void build_st(int n){
	for(int i=1;i<=n;i++)
		st[i][0]=arr[i];
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
		}
	}
	return ;
}

void qu(int l,int r){
	int k=lg2[r-l+1];
	printf("%d\n",max(st[l][k],st[r-(1<<k)+1][k]));
	return ;
}
int main(){
	int n;
	n=read();
	for(int i=1;i<=n;i++)
		arr[i]=read();
	make_log(n);
	build_st(n);
	int m;
	m=read();
	while(m--){
		int l,r;
		l=read();
		r=read();
		qu(l,r);
	} 
	return 0;
}
线段树
CPP
#include<bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int N=1e5+10;
int n,m;
int x,y;
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 a[N];
struct tree{
	int l,r,sum,tag;
}t[4*N]; 
inline void build(int l,int r,int x){
	t[x].r=r,t[x].l=l;
	if(r==l){
		t[x].sum=a[l];
		return ;
	} 
	int mid=(l+r)>>1;
	build(l,mid,ls);
	build(mid+1,r,rs);
	t[x].sum=max(t[ls].sum,t[rs].sum);
}
inline int get_ans(int l,int r,int x){
	if(t[x].l>=l&&t[x].r<=r){
		return t[x].sum;     
	}
	int ans=INT_MIN;
	int mid=(t[x].r+t[x].l)>>1;
	if(l<=mid) ans=max(ans,get_ans(l,r,ls));
	if(r>mid) ans=max(ans,get_ans(l,r,rs));
	return ans;
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	build(1,n,1);
	for(int i=1;i<=m;i++){
		x=read();
		y=read();
		printf("%d\n",get_ans(x,y,1));
	}
}

回复

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

正在加载回复...