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