wa球跳
查看原帖
wa球跳
795344
lfxxx_楼主2024/10/17 18:59

rt

#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;
const int N=2e5+5,B=1005;
int n,m;
int a[N];
bool de[N];
int L[B],R[B],pos[N];
int numpos[N];
vector<int>block[B];
int tr[N];
void add(const int &x,const int &d)
{
	for(int i=x;i<=n;i+=i&-i)
		tr[i]+=d;
}
int query(const int &x)
{
	int res=0;
	for(int i=x;i;i-=i&-i)
		res+=tr[i];
	return res;
}
int query1(const int &l,const int &r,const int &v)//求比 v 小的数的个数
{
	int x=pos[l],y=pos[r],ans=0;
	if(x==y)
	{
		for(int i=l;i<=r;++i)
			if(a[i]<v&&!de[i])
				++ans;
		return ans;
	}
	for(int i=l;i<=R[x];++i)
		if(a[i]<v&&!de[i])
			++ans;
	for(int i=L[y];i<=r;++i)
		if(a[i]<v&&!de[i])
			++ans;
	for(int i=x+1;i<y;++i)
	{
		int x=lower_bound(block[i].begin(),block[i].end(),v)-block[i].begin();
		if(block[i][x]==v)
			--x;
		ans+=Max(0,x);
	}
	return ans;
}
int query2(const int &l,const int &r,const int &v)//求解比 v 大的数的个数
{
	int x=pos[l],y=pos[r],ans=0;
	if(x==y)
	{
		for(int i=l;i<=r;++i)
			if(a[i]>v&&!de[i])
				++ans;
		return ans;
	}
	for(int i=l;i<=R[x];++i)
		if(a[i]>v&&!de[i])
			++ans;
	for(int i=L[y];i<=r;++i)
		if(a[i]>v&&!de[i])
			++ans;
	for(int i=x+1;i<y;++i)
		ans+=block[i].size()-(upper_bound(block[i].begin(),block[i].end(),v)-block[i].begin());
	return ans;
}
void update(const int &x)
{
	const int p=numpos[x];
	de[p]=1;
	block[pos[p]].erase(lower_bound(block[pos[p]].begin(),block[pos[p]].end(),x));
}
void solve()
{
	const int t=sqrt(n*log2(n));int tt=n/t;
	for(int i=1;i<=n;++i)
		cin>>a[i],numpos[a[i]]=i,tr[i]=0,de[i]=0;
	for(int i=1;i<=tt;++i)
	{
		L[i]=R[i-1]+1;
		R[i]=R[i-1]+t;
	}
	if(R[tt]<n)
	{
		++tt;
		L[tt]=R[tt-1]+1;
		R[tt]=n;
	}
	for(int i=1;i<=tt;++i)
	{
		block[i].clear();
		for(int j=L[i];j<=R[i];++j)
		{
			block[i].emplace_back(a[j]);
			pos[j]=i;
		}
		sort(block[i].begin(),block[i].end());
	}
	long long ans=0;
	for(int i=1;i<=n;++i)
	{
		ans+=i-1-query(a[i]);
		add(a[i],1);
	}
	while(m--)
	{
		int x;
		cin>>x;
		cout<<ans<<'\n';
		ans-=query2(1,numpos[x],x)+query1(numpos[x],n,x);
		update(x);
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	while(cin>>n>>m)
		solve();
	
}
2024/10/17 18:59
加载中...