社区讨论

全wa求调

P12685[国家集训队] 排队 加强版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mj2y3fmq
此快照首次捕获于
2025/12/12 22:11
3 个月前
此快照最后确认于
2025/12/14 16:00
3 个月前
查看原帖
rt
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
	register int x=0;
	register bool f=0;
	register char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=(x<<3)+(x<<1)+c-48;
		c=getchar();
	}
	return f?-x:x;
}
const int N=2e5+10;
const int inf=2147483647;
int lsh[N<<1],rt[N],n,m,len;
int tmp[N],tem[N],tot,cnt,num,a[N],ans,v[N];
struct node{
	struct Node{
		int ls,rs,v;
	}w[N<<8];
	inline void chg(int &u,int l,int r,int k,int x){
		if(!u)u=++tot;
		w[u].v+=x;
		if(l==r)return;
		int mid=(l+r)>>1;
		if(k<=mid)chg(w[u].ls,l,mid,k,x);
		else chg(w[u].rs,mid+1,r,k,x);
	}
	inline int qry_rk(int l,int r,int k,int op){
		int sum=0;
		if(l==r){
			for(int i=1;i<=cnt;i++)sum+=w[w[tmp[i]].ls].v;
			for(int i=1;i<=num;i++)sum-=w[w[tem[i]].ls].v;
			return op*sum;
		}
		int mid=l+r>>1;
		if(k<=mid){
			for(int i=1;i<=cnt;i++)tmp[i]=w[tmp[i]].ls;
			for(int i=1;i<=num;i++)tem[i]=w[tem[i]].ls;
			return qry_rk(l,mid,k,op);
		}else{
			for(int i=1;i<=cnt;i++)sum+=w[w[tmp[i]].ls].v,tmp[i]=w[tmp[i]].rs;
			for(int i=1;i<=num;i++)sum-=w[w[tem[i]].ls].v,tem[i]=w[tem[i]].rs;
			return sum+qry_rk(mid+1,r,k,op);
		}
	}
	
}seg;
struct Tre_a{
	inline int lb(int x){
		return x&(-x);
	}
	inline void Add(int u,int x){
		for(int i=u;i<=n;i+=lb(i)){
			seg.chg(rt[i],1,len,a[u],x);
		}
	}
	inline int fid_rk(int l,int r,int k,int op){
		num=cnt=0;
		for(int i=r;i;i-=lb(i))tmp[++cnt]=rt[i];
		for(int i=l-1;i;i-=lb(i))tem[++num]=rt[i];
		return seg.qry_rk(1,len,k,op);
	}
}tre;
signed main() {
	freopen("P12685.in","r",stdin);
	freopen("P12685.ansme","w",stdout);
	n=read();
	for(int i=1; i<=n; i++) {
		lsh[i]=a[i]=read();
	}
	sort(lsh+1,lsh+1+n);
	len=unique(lsh+1,lsh+1+n)-lsh-1;
	for(int i=1; i<=n; i++) {
		a[i]=lower_bound(lsh+1,lsh+1+len,a[i])-lsh;
		tre.Add(i,1);
	}
	for(int i=1;i<=n;i++)ans+=tre.fid_rk(i,n,a[i],0);
	m=read();
	printf("%lld\n",ans);
	while(m--){
		int x=read(),y=read();
		if(x>y)swap(x,y);
		int num=y-x+1,ax=a[x],ay=a[y],vx=v[x],vy=v[y];
		if(a[y]<a[x])ans++;
		else if(a[x]<a[y]) ans--;
		int old=tre.fid_rk(x,y,a[x],0)+num-tre.fid_rk(x,y,a[y],1);
		tre.Add(x,-vx),tre.Add(x,vx);
		tre.Add(y,-vy),tre.Add(y,vy);
		swap(a[x],a[y]);swap(v[x],v[y]);
		int nw=tre.fid_rk(x,y,a[x],0)+num-tre.fid_rk(x,y,a[y],1);
		ans=ans+nw-old;
		printf("%lld\n",ans);
	}
}

回复

0 条回复,欢迎继续交流。

正在加载回复...