【bzoj3702】二叉树

来源:互联网 发布:sql server介绍 编辑:程序博客网 时间:2024/06/18 15:13

Description

现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列)。可以任意交换每个非叶子节点的左右孩子。
要求进行一系列交换,使得最终所有叶子节点的权值按照中序遍历写出来,逆序对个数最少。

Input

第一行n
下面每行,一个数x
如果x==0,表示这个节点非叶子节点,递归地向下读入其左孩子和右孩子的信息,
如果x!=0,表示这个节点是叶子节点,权值为x。

Output

一行,最少逆序对个数。

Sample Input

3

0

0

3

1

2

Sample Output

1
HINT

对于100%的数据:2<=n<=200000。

题解
线段树合并。
我们发现交换两个儿子,则每个儿子原有的逆序对数量不会改变。
于是我们自底向上贪心,每次使节点的逆序对数量尽量少。
对于每个点开权值线段树,代表有哪几个权值的点,合并左右儿子,利用合并的性质判断是否交换。

代码

#include<bits/stdc++.h>#define ll long long#define inf 1000000000using namespace std;const int N=200005;const int mod=1000000007;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}ll ans,a,b;int n,sz,tot,v[N<<1],rt[N<<1],l[N<<1],r[N<<1];int t[N*20],ls[N*20],rs[N*20];void tree(int x){    v[x]=read();    if (v[x]==0)    {        l[x]=++sz;        tree(l[x]);        r[x]=++sz;        tree(r[x]);    }}void build(int &k,int l,int r,int x){    if (!k) k=++tot;t[k]++;    if (l==r) return;    int mid=(l+r)>>1;    if (x<=mid) build(ls[k],l,mid,x);else build(rs[k],mid+1,r,x);}int merge(int x,int y){    if (!x) return y;    if (!y) return x;    a+=(ll)t[ls[x]]*t[rs[y]];    b+=(ll)t[ls[y]]*t[rs[x]];    ls[x]=merge(ls[x],ls[y]);    rs[x]=merge(rs[x],rs[y]);    t[x]=t[ls[x]]+t[rs[x]];    return x;}void solve(int x){    if (!x) return;    solve(l[x]);solve(r[x]);    if (!v[x])    {        a=b=0;        rt[x]=merge(rt[l[x]],rt[r[x]]);        ans+=min(a,b);    }}int main(){    n=read();    sz=1;tree(1);    for (int i=1;i<=sz;i++)        if (v[i]) build(rt[i],1,n,v[i]);    solve(1);    cout<<ans;    return 0;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 水果忍者内购破解版 世界水果大全图片和名字 水果大全图片和名字 水果品种大全 春天有什么水果 水果大全图片 罕见水果名称大全 水果英文单词 高档水果品种大全 水果有哪些品种 中国水果批发网 什么水果好吃 现在吃什么水果好 中国水果网各地价格 热带水果图片及名称 南方水果图片及名称 水果沙拉怎么做 水果种类图片及名称 吃什么水果好 精美创意水果拼盘图片 切水果破解版 水果论坛首页 各种水果的功效 水果蛋糕图片 水果营养价值排行 进口水果批发 进口水果有哪些 进口水果大全 进口水果进货渠道 水果店怎么进货 蒙阳水果批发市场价格 水果怎么做好吃 开一家水果店要多少钱 临沂水果批发市场价格表 水果的品种有哪些 水果代理微商代理 湖南水果特产有哪些 水果风幕柜价格 水果网店怎么开 哪个水果网站好 水果微商文案大全