bzoj3192 [JLOI2013]アイテムツリー配列を削除します

各操作は現在の最大値に直接変更する必要があるため、移動回数だけ前後に移動するのと同じです。

2つのスタックを組み合わせてキューを形成し、ツリー配列を使用して、数値と削除ポイントを直接クエリして回答をカウントします。


コード:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int n,v[100005],n1,n2,a[100005],lin[100005],i,wz[100005],zz,l,r;
long long daan;
map<int ,int >ma;
int lowbit(int o)
{
	return o&(-o);
}
void jia(int wz)
{
  for(;wz<=n;wz+=lowbit(wz))
  v[wz]++;  	
}void jian(int wz)
{
  for(;wz<=n;wz+=lowbit(wz))
  v[wz]--;  	
}
int cha(int wz)
{
	int ans=0;
  for(wz;wz>0;wz-=lowbit(wz))ans+=v[wz];
  return ans;	
}
int main()
{
scanf("%d%d",&n1,&n2);n=n1+n2+1;
for(i=n1;i>=1;i--)
{
	scanf("%d",&a[i]);ma[a[i]]=i;lin[i]=a[i];
 jia(i);
}	
ma[0]=n1+1;
for(i=n1+2;i<=n1+n2+1;i++)
{jia(i);
	scanf("%d",&a[i]);ma[a[i]]=i;lin[i]=a[i];
}		
zz=n1+1;
	sort(lin+1,lin+1+n);
	for(i=n;i>=2;i--)
	{
		int mb=ma[lin[i]];
		l=mb;r=zz;
		if(l>r)swap(l,r);
		int jl=cha(r-1)-cha(l);
		daan+=jl;
		jian(mb);
		zz=mb;	
	}
	printf("%lld",daan);
}


おすすめ

転載: blog.csdn.net/haobang866/article/details/79277096