传送门biu~
每个节点建一条权值线段树,递归合并。
#include<bits/stdc++.h>
using namespace std;
int n;
long long ans,ansL,ansR;
struct Node{
Node *ch[2];
int num;
Node(){ch[0]=ch[1]=NULL;num=0;}
void maintain(){
num=0;
if(ch[0]) num+=ch[0]->num;
if(ch[1]) num+=ch[1]->num;
}
};
void Insert(Node* &o,int x,int L,int R){
if(!o) o=new Node();
++o->num;
if(L==R) return;
int mid=L+R>>1;
if(x<=mid) Insert(o->ch[0],x,L,mid);
else Insert(o->ch[1],x,mid+1,R);
}
void Merge(Node* &a,Node* &b){
if(!b) return;
if(!a) {a=b;return;}
ansL+=1ll*(a->ch[1] ? a->ch[1]->num : 0)*(b->ch[0] ? b->ch[0]->num : 0);
ansR+=1ll*(a->ch[0] ? a->ch[0]->num : 0)*(b->ch[1] ? b->ch[1]->num : 0);
a->num+=b->num;
Merge(a->ch[0],b->ch[0]);
Merge(a->ch[1],b->ch[1]);
a->maintain();
}
Node *init(){
int x;
scanf("%d",&x);
if(!x){
Node *a=init(),*b=init();
ansL=0;ansR=0;
Merge(a,b);
ans+=min(ansL,ansR);
return a;
}
else{
Node *root=new Node();
Insert(root,x,1,n);
return root;
}
}
int main(){
scanf("%d",&n);
init();
printf("%lld",ans);
return 0;
}