92pts,权值线段树求救,#11wa
查看原帖
92pts,权值线段树求救,#11wa
722094
Little_Cancel_Sunny楼主2024/7/16 11:34
#include<bits/stdc++.h>
using namespace std;

const int N=1e6+15;
int t[40*N];
int a[40*N];
int u[40*N];
int al[40*N];
int n,m;
int all[40*N];
int cnt=1;
int ans[40*N];

void push_up(int k)
{
	t[k]=t[k*2]+t[k*2+1];
}

//void build(int k,int l,int r)
//{
//	if(l==r)
//	{
//		t[k]++;
//		return;
//	}
//	else
//	{
//		t[k]++;
//		int mid=(l+r)>>1;
//		build(2*k,l,mid);
//		build(2*k+1,mid+1,r);
//	}
//	push_up(k);
//}

void update(int k,int l,int r,int point)
{
	if(l==r)
	{
		t[k]++;
		return ;
	}
	else
	{
		int mid=(l+r)>>1;
		if(point<=mid)
		{
			update(2*k,l,mid,point);
		}
		else
		{
			update(2*k+1,mid+1,r,point);
		}
		push_up(k);
	}
}

int query_rank(int k,int l,int r,int point)
{
	if(l==r)
	{
		return l;
	}
	else
	{
		int mid=(l+r)>>1;
		int ls=t[2*k];
		int rs=t[2*k+1];
		if(point<=ls)
		{
			return query_rank(k*2,l,mid,point);
		}
		else
		{
			return query_rank(k*2+1,mid+1,r,point-ls);
		}
	}
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		al[i]=a[i];
	}
	for(int i=1;i<=m;i++)
	{
		cin>>u[i];
	}
//	build(1,1,n);
	sort(al+1,al+1+n);
	int sz=unique(al+1,al+1+n)-al;
	for(int i=1;i<=n;i++)
	{
		all[i]=lower_bound(al+1,al+sz+1,a[i])-al;
		update(1,1,n,all[i]);
		//cout<<all[i]<<" "<<a[i]<<" "<<al[i]<<endl;
		while(i==u[cnt])
		{
			ans[cnt]=query_rank(1,1,n,cnt);
			cnt++;
		}
	}
	for(int i=1;i<cnt;i++)
	{
		cout<<al[ans[i]]<<endl;
	}
	return 0;
} 
2024/7/16 11:34
加载中...