社区讨论

稀疏表动态分配封装模板求调

学术版参与者 3已保存回复 12

讨论操作

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

当前回复
12 条
当前快照
1 份
快照标识符
@lo18n0fz
此快照首次捕获于
2023/10/22 16:59
2 年前
此快照最后确认于
2023/11/02 16:50
2 年前
查看原帖
RT,gdb 一直显示改代码在第 15 行段错误,但是我一直找不到哪里有问题。
CPP
//the code is from chenjh
#include<cstdio>
#include<cassert>
#include<algorithm>
template<typename T>
struct SparseTable{
	public:
	SparseTable(int n=0,const T *a=nullptr):N(n){
		assert(n>=0);
		for(int i=0;i<30;i++){st1[i]=new T[n+1];st2[i]=new T[n+1];}
		lg=new unsigned int[n+1];
		lg[1]=0u;
		for(int i=1;i<=n;i++)lg[i]=lg[i>>1u]+1u,st1[0][i]=st2[0][i]=a[i];
		for(unsigned int k=1;k<=lg[n];k++)for(int i=1;i<=n;i++)
			st1[k][i]=(i+(1<<(k-1))<=n)?std::max(st1[k-1][i],st1[k-1][i+(1<<(k-1))]):st1[k-1][i],
			st2[k][i]=(i+(1<<(k-1))<=n)?std::min(st2[k-1][i],st2[k-1][i+(1<<(k-1))]):st2[k-1][i];
	}
	~SparseTable(){delete[] lg;for(int i=0;i<30;i++){delete[] st1[i];delete[] st2[i];}}
	/*
	int * GetLg()const{return lg;}
	T ** GetST1()const{return st1;}
	T ** GetST2()const{return st2;}
	SparseTable&operator = (const SparseTable& y){
		delete[] lg;for(int i=0;i<30;i++){delete[] st1[i];delete[] st2[i];}
		N=y.size();
		int*Lg=y.GetLg();
		lg=new int[N+1];memset(lg,Lg,sizeof Lg);
		for(int i=1;i<30;i++){st1[i]=new T[]}
	}
	*/
	inline int size()const{return N;}
	inline T QueryMax(const int l,const int r){
		assert(0<l && l<=r && r<=N);
		int k=lg[r-l+1];
		return std::max(st1[l][k],st1[r-(1<<k)+1][k]);
	}
	inline T QueryMin(const int l,const int r){
		assert(0<l && l<=r && r<=N);
		int k=lg[r-l+1];
		return std::min(st2[l][k],st2[r-(1<<k)+1][k]);
	}
	private:
	int N;
	unsigned int *lg;
	T *st1[30],*st2[30];
};
int n,m;
int a[100001];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	SparseTable<int> st(n,a);
	for(int x,y;m--;)scanf("%d%d",&x,&y),printf("%d\n",st.QueryMax(x,y));
	return 0;
}

回复

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

正在加载回复...