#11wa
查看原帖
#11wa
594755
niweizheni楼主2024/7/16 14:59

大佬求助,权值线段树

#include<bits/stdc++.h>
using namespace std;

const int N=5e6+15;
long long a[N],b[N],disc[N],tot=1;
int n,m;

long long rd[N],ld[N],size[N]={},val[N],ans[N];

void pushup(int x)
{
	size[x]=size[x*2]+size[x*2+1];
}

void build(int x,int l,int r)
{
	ld[x]=l;
	rd[x]=r;
	if(l==r)
	{
		val[x]=l;
		return;
	}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
}

void update(int x,int plas)
{
	if(ld[x]==rd[x])
	{
		size[x]++;
		return;
	}
	int mid=(ld[x]+rd[x])/2;
	if(plas<=mid)
	{
		update(x*2,plas);
	}
	else
	{
		update(x*2+1,plas);
	}
	pushup(x);
}

long long query(int x,int loca)
{
	//cout<<ld[x]<<"    "<<rd[x];
	if(ld[x]==rd[x])
	{
		//cout<<loca<<"   ";
		return ld[x];
	}
	int siz=size[x*2];
	if(loca<=siz)
	{
		return query(x*2,loca);
	}
	else
	{
		return query(x*2+1,loca-siz);
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		disc[i]=a[i];
	}
	for(int i=1;i<=m;i++)
	{
		cin>>b[i];
	}
	sort(disc+1,disc+n+1);
	int len=unique(disc+1,disc+n+1)-disc-1;
	//cout<<len;
	build(1,1,len);
	for(int i=1;i<=n;i++)
	{
		int fw;
		fw=lower_bound(disc+1,disc+n+1,a[i])-disc;
		update(1,fw);
		for(int j=tot;j<=m;j++)
		{
			if(b[tot]==i)
			{
				//cout<<i<<tot;
				ans[tot]=query(1,tot);
				//cout<<ans[tot];
				tot++;
			}
			else
			{
				break;
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		cout<<disc[ans[i]]<<endl;
	}
	return 0;
}
2024/7/16 14:59
加载中...