玄关 dalao求调QAQ
  • 板块学术版
  • 楼主chu_yh
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/23 19:26
  • 上次更新2025/1/23 22:08:28
查看原帖
玄关 dalao求调QAQ
1271341
chu_yh楼主2025/1/23 19:26

P3521 [POI2011] ROT-Tree Rotations

样例已过,只有2分

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
int n,cnt,r[N*20],ls[N*20],rs[N*20],t[N*20];
long long ans,a,b;

void update(int &u,int l,int r,int g){
	if(!u) u=++cnt;
	if(l==r){t[cnt]=1;return ;}
	int mid=(l+r)>>1;
	if(g<=mid) update(ls[u],l,mid,g);
	else update(rs[u],mid+1,r,g);
	t[u]=t[ls[u]]+t[rs[u]];
}

int Merge(int a,int b,int l,int r,long long &A1,long long &A2){
	if(!a||!b) return a+b;
	if(l==r){t[a]+=t[b];return a;}
	int mid=(l+r)>>1;
	ls[a]=Merge(ls[a],ls[b],l,mid,A1,A2);
	rs[a]=Merge(rs[a],rs[b],mid+1,r,A1,A2);
	A1+=t[ls[a]]*t[rs[b]],A2+=t[ls[b]]*t[rs[a]];
	t[a]=t[ls[a]]+t[rs[a]];
	return a;
}

int dfs(){
	int u=0,x;
	scanf("%d",&x);
	if(x) update(u,1,n,x);
	else{
		int lk=dfs(),rk=dfs();
		long long a1=0,a2=0;
		u=Merge(lk,rk,1,n,a1,a2);
		ans+=min(a1,a2);
	}
	return u;
}

int main(){
	scanf("%d",&n);
	dfs();
	printf("%lld",ans);
	return 0;
}
2025/1/23 19:26
加载中...