关于主席树 的疑惑,数组应该开多大?
查看原帖
关于主席树 的疑惑,数组应该开多大?
483058
陈泽涵爱g编程楼主2022/8/4 14:16

我75分的代码tree数组开的 3e5403e5*40然后挂了;

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int tot;
const int maxn=3e5+1;
struct node {
	int l,r,val;
} tree[maxn*40];
int root[maxn];
int New(int x) {
	int rt=++tot;
	tree[rt]=tree[x];
	return rt;
}
#define mid (l+r>>1)
int update(int rt,int l,int r,int p,int val) {
	rt=New(rt);
	if(l==r) {
		tree[rt].val+=val;
		return rt;
	}
	if(mid>=p) {
		tree[rt].l=update(tree[rt].l,l,mid,p,val);
	} else {
		tree[rt].r=update(tree[rt].r,mid+1,r,p,val);
	}
	return rt;
}
int query(int rt1,int rt2,int l,int r,int p) {
	if(l==r) {
		return tree[rt2].val-tree[rt1].val;
	}
	if(mid>=p) {
		return query(tree[rt1].l,tree[rt2].l,l,mid,p);
	} else {
		return query(tree[rt1].r,tree[rt2].r,mid+1,r,p);
	}
}
int num[maxn];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		cin>>num[i];
		root[i]=update(root[i-1],1,3e5,num[i],1);
	}
	for(int i=1; i<=m; i++) {
		int op;
		cin>>op;
		if(op==1) {
			int l,r,c;
			cin>>l>>r>>c;
			cout<<query(root[l-1],root[r],1,3e5,c)<<'\n';
		} else {
			int x;
			cin>>x;
			if(num[x]==num[x+1]) continue;
			root[x]=update(root[x],1,3e5,num[x],-1);
			root[x]=update(root[x],1,3e5,num[x+1],1);
			swap(num[x],num[x+1]);
		}
	}
	return 0;
}

改成3e5*60就过了,什么原因。

2022/8/4 14:16
加载中...