主席树求助
查看原帖
主席树求助
574568
Dr_Gilbert南科蛤蟆楼主2022/3/21 16:33

数组不管开多大,#4 #6-10 都 MLE,感觉是哪里写挂了,但实在太弱调不出来,求大佬帮忙

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int n,m,tot,cmpmode;
int rt[200010],ori[200010];//ori离散化用
struct num{
	int val, ls, id;
	bool operator <(const num& a) const{
		if (cmpmode) return id<a.id;
		else return val<a.val;
	}
}a[200010];
struct node{
	int ls, rs, val;
}stree[15887712];
int clone(int x){
	stree[++tot]=stree[x];
	return tot;
}
void pushup(int x){
	stree[x].val=stree[stree[x].ls].val+stree[stree[x].rs].val;
	return;
}
int build(int l, int r){
	int x=++tot;
	stree[x].val=0;
	if (l==r) return x;
	int mid=l+r>>1;
	stree[x].ls=build(l,mid);
	stree[x].rs=build(mid+1,r);
	pushup(x);return x;
}
int update(int x, int l ,int r, int c, int dlt){
	x=clone(x);
	int mid=l+r>>1;
	if (l==r&&l==c){
		stree[x].val+=dlt;
		return x;
	}
	if (c<=mid) stree[x].ls=update(stree[x].ls,l,mid,c,dlt);
	if (c>mid) stree[x].rs=update(stree[x].rs,mid+1,r,c,dlt);
	pushup(x);
	return x;
}
int query(int lx, int rx, int l, int r, int k){
	int t=stree[stree[rx].ls].val-stree[stree[lx].ls].val;
	int mid=l+r>>1;
	if (l==r){
		return l;
	}
	if (t<k) return query(stree[lx].rs,stree[rx].rs,mid+1,r,k-t);
	else return query(stree[lx].ls,stree[rx].ls,l,mid,k);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);cout.tie(nullptr);
	cin>>n>>m;
	for (int i=1;i<=n;i++){
		cin>>a[i].val;
		a[i].id=i;
	}
	sort(a+1,a+1+n);
	int lsid=0;
	for (int i=1;i<=n;i++){
		if (a[i].val!=a[i-1].val) lsid++;
		a[i].ls=lsid;ori[lsid]=a[i].val;
	}
	cmpmode=1;sort(a+1,a+1+n);
	rt[0]=build(1,lsid);
	for (int i=1;i<=n;i++){
		rt[i]=update(rt[i-1],1,lsid,a[i].ls,1);
	}
	for (int i=1;i<=m;i++){
		int l,r,k;
		cin>>l>>r>>k;
		int x=query(rt[l-1],rt[r],1,lsid,k);
		cout<<ori[x]<<endl;
	}
	return 0;
} 
2022/3/21 16:33
加载中...