Bzoj2212: [poi2011] tree rotations

Source: Internet
Author: User
2212: [poi2011] tree rotationstime limit: 20 sec memory limit: 259 MB
Submit: 391 solved: 127
[Submit] [Status] 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 br Anch. each leaf of the tree is labeled with an integer from the range. the labels of leaves are unique. with some gardening work, a so called rotation can be performed med 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.

Now there is a binary tree, and all non-leaf nodes have two children. There is a weight on each leaf node (there are n leaf nodes that satisfy an arrangement where these weights are 1 .. n ). The left and right children of each non-leaf node can be exchanged at will.
A series of exchanges are required, so that the weights of all leaf nodes are written in the traversal order, with the smallest number of pairs in the reverse order.

 

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 labeled 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 ).

First line N
Each row below contains x
If X = 0, it indicates that the node is not a leaf node and recursively reads the information of its left and right children,
If X! = 0, indicating that this node is a leaf node with the weight of X

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.

One row with at least the number of Reverse Order Pairs

 

Sample input3
0
0
3
1
2
Sample output1hint Source

Question:

My practice is as follows ...)

Because the reverse direction of the Left subtree + the right subtree = the reverse direction inside the left subtree + the reverse direction inside the right subtree + the reverse direction between the left subtree and the right subtree

However, the first two parts will not change by exchanging left and right Subtrees, so we only need to greedy to see if the reverse pairs between left and right Subtrees will decrease after the exchange,

If it is reduced, it is switched, and then recursive down to solve the left and right subtree.

In this process, we used a method similar to the noi2007 currency exchange method,

Sort by X first, and then O (n) can be used to calculate the reverse order,

Then, divide the data into two parts by Y, and recursive the data.

Then press X to merge the two parts so that the original array is still in order.

Then hand it in to T chengxiang...

I thought about it and suddenly found that it would be stuck as O (N ^ 2! If this tree is extremely unbalanced!

Paste my code first, and then worship the question...

 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set>10 #include<queue>11 #include<string>12 #define inf 100000000013 #define maxn 1000000+1000014 #define maxm 500+10015 #define eps 1e-1016 #define ll long long17 #define pa pair<int,int>18 #define for0(i,n) for(int i=0;i<=(n);i++)19 #define for1(i,n) for(int i=1;i<=(n);i++)20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)22 #define mod 100000000723 using namespace std;24 inline int read()25 {26     int x=0,f=1;char ch=getchar();27     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}28     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}29     return x*f;30 }31 ll n,tot,cnt=1,v[maxn],ls[maxn],rs[maxn],s[maxn],sum[2],ans[2];32 ll ret=0;33 struct rec{int x,y;}a[maxn],b[maxn];34 void dfs(int x)35 {36    v[x]=read();37     if(v[x]){s[x]=1;a[++tot].x=v[x];a[tot].y=tot;return;};38     ls[x]=++cnt;dfs(ls[x]);39     rs[x]=++cnt;dfs(rs[x]);40     s[x]=s[ls[x]]+s[rs[x]];41 }42 void solve(int k,int l,int r)43 {44     int mid=l+s[ls[k]]-1,pl=l-1,pr=mid;45     if(!s[ls[k]])return;46     sum[0]=sum[1]=ans[0]=ans[1]=0;47     for2(i,l,r)48      {49          int x=a[i].y<=mid?0:1;50          sum[x]++;ans[x]+=sum[1-x];51      }52     ret+=min(ans[0],ans[1]);53     for2(i,l,r)if(a[i].y<=mid)b[++pl]=a[i];else b[++pr]=a[i]; 54     for2(i,l,r)a[i]=b[i];55     solve(ls[k],l,mid);56     solve(rs[k],mid+1,r);57     pl=l,pr=mid+1;58     for2(i,l,r)59      if((a[pl].x<a[pr].x||pr>r)&&pl<=mid)b[i]=a[pl++];else b[i]=a[pr++];60     for2(i,l,r)a[i]=b[i];61 }62 inline bool cmp(rec a,rec b)63 {64     return a.x<b.x;65 }66 int main()67 {68     freopen("input.txt","r",stdin);69     freopen("output.txt","w",stdout);70     n=read();71     dfs(1);72     //for1(i,4*n)cout<<ls[i]<<‘ ‘<<rs[i]<<‘ ‘<<s[i]<<endl;73     sort(a+1,a+n+1,cmp);74     solve(1,1,n);75     printf("%lld\n",ret);76     return 0;77 }
View code

 

 

 

Bzoj2212: [poi2011] tree rotations

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.