传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2212http://www.lydsy.com/JudgeOnline/problem.php?id=3702
启发式合并不解释
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
struct node{
int val,key,size,s;
node *c[2];
node(int _val=0,node *C=0){
val=_val;key=rand();
size=s=1;c[0]=c[1]=C;
}void rz(){
size=c[0]->size+s+c[1]->size;
}
};
struct Treap{
node *root,*Null;
Treap(){
Null=new node(0,0);
Null->size=Null->s=0;Null->key=INT_MAX;
Null->c[0]=Null->c[1]=Null;root=Null;
}
void rot(node *&t,bool d){
node *p=t->c[d];t->c[d]=p->c[!d];
p->c[!d]=t;t->rz();p->rz();t=p;
}
void _insert(node *&t,int x){
if(t==Null){t=new node(x,Null);return;}
if(t->val==x){t->s++;t->size++;return;}
_insert(t->c[x>t->val],x);
if(t->c[x>t->val]->key<t->key)
rot(t,x>t->val);else t->rz();
}
int _kth(node *t,int x){
int r=t->c[0]->size;
if(x<=r)return _kth(t->c[0],x);
else if(x>r+t->s) return _kth(t->c[1],x-r-t->s);
return t->val;
}
int _rank(node *t,int x){
if(t==Null)return 0;
int r=t->c[0]->size;
if(x<t->val)return _rank(t->c[0],x);
else if(x>t->val)return _rank(t->c[1],x)+r+t->s;
return r;
}
void erase(node *t){
if(t->c[0]!=Null)erase(t->c[0]);
if(t->c[1]!=Null)erase(t->c[1]);
delete t;
}
void clear(){erase(root);}
void insert(int x){_insert(root,x);}
int kth(int x){return _kth(root,x);}
int rank(int x){return _rank(root,x);}
int size(){return root->size;}
}T[maxn];
typedef long long LL;
int n;
LL cnt[maxn],ans;
int tot=1;
int getint(){
int res=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))res=res*10+c-'0',c=getchar();
return res;
}
void dfs(int u){
int x=getint();
if(!x){
int l=++tot,r=++tot;
dfs(l);
dfs(r);
if(T[l].size()<T[r].size())swap(l,r);
LL res=0;
for(int i=1;i<=T[r].size();i++)
res+=T[l].rank(T[r].kth(i));
ans+=min(res,(LL)T[l].size()*T[r].size()-res);
for(int i=1;i<=T[r].size();i++){
int k=T[r].kth(i);
T[l].insert(k);
}T[u]=T[l];
}else T[u].insert(x);
}
int main(){
scanf("%d",&n);
dfs(1);
cout<<ans<<endl;
return 0;
}