悬棺求调70pts
查看原帖
悬棺求调70pts
1039659
ilibilib楼主2024/3/1 16:26
#include<iostream>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int N=2e6+10;
const int M=1e3+10;
int n,m;
int tree[N];
inline int lowbit(int x){return x&-x;}
inline void updata(int x)
{
	while(x<=n){++tree[x],x+=lowbit(x);}
	return;
}
inline int query(int x)
{
	int sum=0;
	while(x){sum+=tree[x],x-=lowbit(x);}
	return sum;
}
int ans=0;
int a[N],b[N];
int st[M],ed[M],pos[N];
inline int change(int l,int r)
{
	int w=1;
	int mi=min(a[l],a[r]);
	int ma=max(a[l],a[r]);
	if(a[l]>a[r]) w=-1;
	swap(a[l],a[r]);
	for(int i=st[pos[l]];i<=ed[pos[l]];i++) b[i]=a[i];
	sort(b+st[pos[l]],b+ed[pos[l]]+1);
	for(int i=st[pos[r]];i<=ed[pos[r]];i++) b[i]=a[i];
	sort(b+st[pos[r]],b+ed[pos[r]]+1);
	int res=0;
	if(pos[l]==pos[r])
		for(int i=l+1;i<=r-1;i++) res+=(a[i]>mi&&a[i]<ma);
	else{
		for(int i=pos[l]+1;i<=pos[r]-1;i++)
			res+=upper_bound(b+st[i],b+ed[i]+1,ma)-lower_bound(b+st[i],b+ed[i]+1,mi);
		for(int i=l+1;i<=ed[pos[l]];i++) res+=(a[i]>mi&&a[i]<ma);
		for(int i=st[pos[r]];i<=r-1;i++) res+=(a[i]>mi&&a[i]<ma);
	}
	return (2*res+1)*w;
}
inline void build(int n)
{
	int len=sqrt(n);
	int t=n/len+(bool)(n%len);
	for(int i=1;i<=n;i++)
		pos[i]=(i-1)/len+1,b[i]=a[i];
	for(int i=1;i<=t;i++)
	{
		st[i]=(i-1)*len+1,ed[i]=(i==t)?n:i*len;
		sort(b+st[i],b+ed[i]+1);
	}
	return;
}
inline void init()
{
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+n,a[i])-b;
	for(int i=1;i<=n;i++)
		updata(a[i]),ans+=i-query(a[i]);
	cout<<ans<<'\n';
	return;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
	init();
	build(n);
	cin>>m;
	int l,r;
	while(m--)
	{
		cin>>l>>r;
		if(l>r) swap(l,r);
		ans+=change(l,r);
		cout<<ans<<'\n';
	}
	return 0;
}
2024/3/1 16:26
加载中...