求问
查看原帖
求问
935896
Shellchen楼主2025/7/24 21:11

这份代码会 MLE

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10,mod=1e9+7;
int tot;
struct node
{
	int l,r,sum,lc,rc;
}tr[N<<5];
int a[N],b[N],p,rt[N];
int find(int x)
{
	return lower_bound(b+1,b+p+1,x)-b;
}
int build(int l,int r)
{
	int u=++tot;
	tr[u].l=l;
	tr[u].r=r;
	if(l==r) return u;
	int mid=(l+r)>>1;
	tr[u].lc=build(l,mid);
	tr[u].rc=build(mid+1,r);
	return u;
}
int modify(int u,int x)
{
	int d=++tot;
	tr[d]=tr[u],tr[d].sum++;
	if(tr[d].l==tr[d].r) return d;
	int mid=(tr[d].l+tr[d].r)>>1;
	if(x<=mid) tr[d].lc=modify(tr[d].lc,x);
	else tr[d].rc=modify(tr[d].rc,x);
	return d;
}
int query(int u,int l,int r,int x)
{
	if(tr[u].l==tr[u].r) return tr[u].l;
	int mid=(tr[u].l+tr[u].r)>>1,p=tr[tr[r].lc].sum-tr[tr[l].lc].sum;
	if(x<=p) return query(tr[u].lc,tr[l].lc,tr[r].lc,x);
	else return query(tr[u].rc,tr[l].rc,tr[r].rc,x-p);
}
signed main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
	p=unique(b+1,b+n+1)-b-1;
	rt[0]=build(1,n);
	for(int i=1;i<=n;i++) rt[i]=modify(rt[i-1],find(a[i]));
	while(m--)
	{
		int l,r,x;
		cin>>l>>r>>x;
		cout<<b[query(rt[0],rt[l-1],rt[r],x)]<<'\n';
	}
	return 0;
}

将常量 N 改为 2e5+10 即可 AC。

很明显,1e5*32 的空间对于主席树来说是不够的。但是想问,为什么是 MLE 而不是 RE 之类的?

2025/7/24 21:11
加载中...