# [bzoj2212][线段树合并]Tree Rotations

10人阅读 评论(0)

Description

Byteasar the gardener is growing a rare tree called Rotatus
Informatikus. It has some interesting features: The tree consists of
straight branches, bifurcations and leaves. The trunk stemming from
the ground is also a branch. Each branch ends with either a
bifurcation or a leaf on its top end. Exactly two branches fork out
from a bifurcation at the end of a branch - the left branch and the
right branch. Each leaf of the tree is labelled with an integer from
the range . The labels of leaves are unique. With some gardening work,
a so called rotation can be performed on any bifurcation, swapping the
left and right branches that fork out of it. The corona of the tree is
the sequence of integers obtained by reading the leaves’ labels from
left to right. Byteasar is from the old town of Byteburg and, like all
true Byteburgers, praises neatness and order. He wonders how neat can
his tree become thanks to appropriate rotations. The neatness of a
tree is measured by the number of inversions in its corona, i.e. the
number of pairs（I,j）, (1< = I < j < = N ) such that(Ai>Aj) in the
corona(A1,A2,A3…An). The original tree (on the left) with
corona(3,1,2) has two inversions. A single rotation gives a tree (on
the right) with corona(1,3,2), which has only one inversion. Each of
these two trees has 5 branches. Write a program that determines the
minimum number of inversions in the corona of Byteasar’s tree that can
be obtained by rotations.

Input

In the first line of the standard input there is a single integer (2<
= N < = 200000) that denotes the number of leaves in Byteasar’s tree. Next, the description of the tree follows. The tree is defined
recursively: if there is a leaf labelled with ()(1<=P<=N) at the end
of the trunk (i.e., the branch from which the tree stems), then the
tree’s description consists of a single line containing a single
integer , if there is a bifurcation at the end of the trunk, then the
tree’s description consists of three parts: the first line holds a
single number , then the description of the left subtree follows (as
if the left branch forking out of the bifurcation was its trunk), and
finally the description of the right subtree follows (as if the right
branch forking out of the bifurcation was its trunk).

1<=n<=200000

Output

In the first and only line of the standard output a single integer is
to be printed: the minimum number of inversions in the corona of the
input tree that can be obtained by a sequence of rotations.

Sample Input

3

0

0

3

1

2

Sample Output

1

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
struct node
{
int lc,rc,c;
}tr[4100000];int trlen;
int rt[410000],tot[410000];
void add(int &now,int l,int r,int p)
{
if(now==0)now=++trlen;
tr[now].c++;
if(l==r)return ;
int mid=(l+r)/2;
}
LL ans,xgo,ygo,xsum,ysum;
LL xmax,ymax;
void merge(int &x,int y)
{
if(x==0)
{
ysum+=(LL)(xmax-xgo)*tr[y].c;
ygo+=(LL)tr[y].c;
x=y;return ;
}
if(y==0)
{
xsum+=(LL)(ymax-ygo)*tr[x].c;
xgo+=(LL)tr[x].c;
return ;
}
tr[x].c+=tr[y].c;
merge(tr[x].lc,tr[y].lc);
merge(tr[x].rc,tr[y].rc);
}
int TT;
int n;
void getpow()
{
TT++;int x,tmp=TT;
scanf("%d",&x);
if(x==0)
{
int lc=TT+1;getpow();
int rc=TT+1;getpow();
xmax=tr[rt[lc]].c,ymax=tr[rt[rc]].c;
xsum=ysum=xgo=ygo=0;
merge(rt[lc],rt[rc]);
rt[tmp]=rt[lc];
ans+=min(xsum,ysum);
}
else
{
return ;
}
}
int main()
{
//  freopen("rot12.in","r",stdin);
//  freopen("sample.out","w",stdout);
scanf("%d",&n);
xmax=tr[1].c;ymax=tr[2].c;
merge(rt[1],rt[2]);
printf("%d %d\n",xsum,ysum);*/
getpow();
printf("%lld\n",ans);
return 0;
}

个人资料
等级：
访问量： 3万+
积分： 3400
排名： 1万+
博主的机房gay佬们啦啦啦啦啦
博客专栏
 OI路漫漫 文章：109篇 阅读：34216
最新评论