求助!权值线段树样例过不去 WA 12分
查看原帖
求助!权值线段树样例过不去 WA 12分
476767
羊叫兽同学楼主2022/7/19 09:54

rt,

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int n,m,s,l,i,j,askind[1145140],askx[1145140],val[1145140],maxx,top,old_concept[1145140];
map<int,int>new_concept;
struct tree
{
	int l,r,sum;
}a[1145140];
void build(int l,int r,int p)
{
	a[p].l=l;
	a[p].r=r;
	if(l==r)
		return ;
	int mid=(l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	return ;
}
void change(int x,int d,int p)
{
	if(a[p].l==a[p].r)
	{
		a[p].sum+=d;
		return ;
	}
	int mid=(a[p].l+a[p].r)>>1;
	if(x<=mid)
		change(x,d,p<<1);
	else
		change(x,d,p<<1|1);
	a[p].sum+=d;
	return ;
}
int ask_sum(int l,int r,int p)
{
	if(l>r)
		return 0;
	if(l<=a[p].l&&a[p].r<=r)
		return a[p].sum;
	int mid=(a[p].l+a[p].r)>>1,sum=0;
	if(l<=mid)
		sum+=ask_sum(l,r,p<<1);
	if(mid<r)
		sum+=ask_sum(l,r,p<<1|1);
	return sum;
}
int ask_x_pm(int x)
{
	if(x>maxx)
		return maxx+1;
	return 1+ask_sum(1,x-1,1);
}
int ask_pm_x(int x,int p)
{
	if(a[p].l==a[p].r)
		return a[p].l;
	if(a[p<<1].sum>=x)
		return ask_pm_x(x,p<<1);
	return ask_pm_x(x-a[p<<1].sum,p<<1|1);
}
int ask_front(int x)
{
//	cout<<"QAQ "<<ask_x_pm(x)<<endl;
	return ask_pm_x(ask_x_pm(x)-1,1);
}
int ask_back(int x)
{
//	cout<<"QAQ "<<ask_x_pm(x)<<endl;
	return ask_pm_x(ask_x_pm(x)+1,1);
}
int main()
{
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&askind[i],&askx[i]);
		val[i]=askx[i];
	}
	sort(val+1,val+1+m);
	for(i=1;i<=m;i++)
	{
		if(new_concept[val[i]]==0)
		{
			maxx++;
			new_concept[val[i]]=maxx;
			old_concept[maxx]=val[i];
		}
	}
/*	for(i=1;i<=m;i++)
	{
		cout<<askind[i]<<" "<<new_concept[askx[i]]<<endl;
	}*/
	build(1,maxx,1);
	for(i=1;i<=m;i++)
	{
		if(askind[i]==1)
			change(new_concept[askx[i]],1,1);
		if(askind[i]==2)
			change(new_concept[askx[i]],-1,1);
		if(askind[i]==3)
			printf("%d\n",old_concept[ask_x_pm(new_concept[askx[i]])]);
		if(askind[i]==4)
			printf("%d\n",old_concept[ask_pm_x(askx[i],1)]);
		if(askind[i]==5)
			printf("%d\n",old_concept[ask_front(new_concept[askx[i]])]);
		if(askind[i]==6)
			printf("%d\n",old_concept[ask_front(new_concept[askx[i]])]);
	}
/*	for(i=1;i<=maxx;i++)
	{
		printf("%d %d\n",old_concept[i],ask_sum(i,i,1)); 
	}*/
}
2022/7/19 09:54
加载中...