其它点最慢只有52ms,但是T了第一和最后一个点,嘤qwq
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=2e5+5,M=105,S=2e5;
int val[N*40],ls[N*40],rs[N*40],L[N],R[N],rt[N],ans[N],RT,cnt,tot,lcnt,acnt,bcnt,n,psiz;
void psu(int p){val[p]=val[ls[p]]+val[rs[p]];}
void upd(int l,int r,int &p,int cp){
if(!p)p=++tot;
if(l==r){
val[p]++;
return;
}
int mid=(l+r)>>1;
if(cp<=mid)upd(l,mid,ls[p],cp);
else upd(mid+1,r,rs[p],cp);
psu(p);
}
int Merge(int u,int v,int l,int r){
if(!u){
acnt+=lcnt*val[v];
bcnt+=(psiz-lcnt)*val[v];
return v;
}
if(!v){
lcnt+=val[u];
return u;
}
int mid=(l+r)>>1;
ls[u]=Merge(ls[u],ls[v],l,mid);
rs[u]=Merge(rs[u],rs[v],mid+1,r);
psu(u);
return u;
}
void dfs(int &u){
if(!u)u=++cnt;
int x; cin>>x; //info
if(x==0){
dfs(L[u]);
dfs(R[u]);
ans[u]=ans[L[u]]+ans[R[u]];
psiz=val[rt[L[u]]]; acnt=0; bcnt=0; lcnt=0;
rt[u]=Merge(rt[L[u]],rt[R[u]],1,n);
ans[u]+=min(acnt,bcnt);
}
else upd(1,n,rt[u],x);
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
dfs(RT);
cout<<ans[RT];
return 0;
}