社区讨论

求助,为什么封装线段树寄了

P4137Rmq Problem / mex参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m3mmb8ee
此快照首次捕获于
2024/11/18 14:01
去年
此快照最后确认于
2025/11/04 14:29
4 个月前
查看原帖
CPP
#include<iostream>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<random>
#include<chrono>
using namespace std;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
typedef long long LL;
const int N=2e5+10;
int n,m;
int a[N];
int root[N],idx;
struct node{
	int ls,rs;
	int mn;
}tr[N*40];
void pushup(int u){
	tr[u].mn=min(tr[tr[u].ls].mn,tr[tr[u].rs].mn);
}
int insert(int p,int l,int r,int pos,int k){
	int q=++idx;
	tr[q]=tr[p];
	if(l==r){
		tr[q].mn=k;
		return q;
	}
	int mid=(l+r)>>1;
	if(pos<=mid)tr[q].ls=insert(tr[p].ls,l,mid,pos,k);
	else tr[q].rs=insert(tr[q].rs,mid+1,r,pos,k);
	pushup(q);
	return q;
}
int query(int p,int l,int r,int k){
	if(l==r)return l;
	int mid=(l+r)>>1;
	if(tr[tr[p].ls].mn<k)return query(tr[p].ls,l,mid,k);
	else return query(tr[p].rs,mid+1,r,k);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i],a[i]++;
	for(int i=1;i<=n;i++)
		root[i]=insert(root[i-1],1,n+1,a[i],i);
	while(m--){
		int l,r;cin>>l>>r;
		cout<<query(root[r],1,n+1,l)-1<<'\n';
	}
	return 0;
}
封装代码。
CPP
#include<iostream>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<random>
#include<chrono>
using namespace std;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
typedef long long LL;
const int N=2e5+10;
int n,m;
int a[N];
struct DS{
	int root[N],idx;
	struct node{
		int ls,rs;
		int mn;
	}tr[N*40];
	void pushup(int u){
		tr[u].mn=min(tr[tr[u].ls].mn,tr[tr[u].rs].mn);
	}
	int build(int l,int r){
		int p=++idx;
		if(l==r)return p;
		int mid=(l+r)>>1;
		tr[p].ls=build(l,mid);
		tr[p].rs=build(mid+1,r);
	}
	int insert(int p,int l,int r,int pos,int k){
		int q=++idx;
		tr[q]=tr[p];
		if(l==r){
			tr[q].mn=k;
			return q;
		}
		int mid=(l+r)>>1;
		if(pos<=mid)tr[q].ls=insert(tr[p].ls,l,mid,pos,k);
		else tr[q].rs=insert(tr[q].rs,mid+1,r,pos,k);
		pushup(q);
		return q;
	}
	int query(int p,int l,int r,int k){
		if(l==r)return l;
		int mid=(l+r)>>1;
		if(tr[tr[p].ls].mn<k)return query(tr[p].ls,l,mid,k);
		else return query(tr[p].rs,mid+1,r,k);
	}
}seg;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i],a[i]++;
	for(int i=1;i<=n;i++){
		seg.root[i]=seg.insert(seg.root[i-1],1,n+1,a[i],i);
	}
	while(m--){
		int l,r;cin>>l>>r;
		cout<<seg.query(seg.root[r],1,n+1,l)-1<<'\n';
	}
	return 0;
}

回复

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

正在加载回复...