题目大意:

一棵二叉树,所有非叶子节点都有两个孩子

在每个叶子节点上有一个权值 可以任意交换每个非叶子节点的左右孩子

要求进行一系列交换,使得最终所有叶子节点的权值按照顺序写出来,逆序对个数最少

思路:

建立权值线段树

dfs时 对于每个节点 判断交换更好还是不交换好 再加上左右儿子的答案向上继续传递答案

判断的时候merge

 1
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstdlib>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<vector>
 9 #include<queue>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 400100
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
19     return x*f;
20 }
21 int n,o,rt[MAXN],tot,ch[MAXN][2],val[MAXN],ls[MAXN<<5],rs[MAXN<<5];
22 ll ansl,ansr,sum[MAXN<<5];
23 void init(int &x)
24 {
25     if(!x) x=++tot;
26     val[x]=read();
27     if(!val[x]) {init(ch[x][0]);init(ch[x][1]);}
28 }
29 void mdf(int &k,int l,int r,int x)
30 {
31     k=++tot;
32     if(l==r) {sum[k]=1;return ;}
33     int mid=(l+r)>>1;
34     if(x<=mid) mdf(ls[k],l,mid,x);
35     else mdf(rs[k],mid+1,r,x);
36     sum[k]=sum[ls[k]]+sum[rs[k]];
37 }
38 int merge(int a,int b)
39 {
40     if(!a||!b) return a+b;
41     ansl+=sum[rs[a]]*sum[ls[b]];
42     ansr+=sum[ls[a]]*sum[rs[b]];
43     ls[a]=merge(ls[a],ls[b]);
44     rs[a]=merge(rs[a],rs[b]);
45     sum[a]=sum[ls[a]]+sum[rs[a]];
46     return a;
47 }
48 ll dfs(int x)
49 {
50     ll res=0;
51     if(!val[x])
52     {
53         res=dfs(ch[x][0])+dfs(ch[x][1]);
54         ansl=ansr=0;
55         rt[x]=merge(rt[ch[x][0]],rt[ch[x][1]]);
56         res+=min(ansl,ansr);
57     }
58     else mdf(rt[x],1,n,val[x]);
59     return res;
60 }
61 int main()
62 {
63     n=read();
64     init(o);tot=0;
65     printf("%lld",dfs(1));
66 }

View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/9806715.html

bzoj 2212 Tree Rotations相关推荐

  1. 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf

    文章目录 [HNOI2012]永无乡 Lomsat gelral 「POI2011 R2 Day2」旋转树木 Tree Rotations Escape Through Leaf 线段树合并与 fhq ...

  2. 【BZOJ2212】【POI2011】Tree Rotations(线段树合并)

    Description click me Solution 对于每个节点有一棵权值线段树,向上递归时合并同时计算逆序对即可. Source /***************************** ...

  3. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

  4. Tree Rotations HYSBZ - 2212

    https://www.lydsy.com/JudgeOnline/problem.php?id=2212 线段树合并核心代码就是merge 学过线段树一看就明白了 这道题虽然是裸题 但不看题解的话题 ...

  5. bzoj 1468 Tree(点分治模板)

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1527  Solved: 818 [Submit][Status][Discus ...

  6. [BZOJ 2654]tree(陈立杰)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

  7. [Poi2011]Tree Rotations线段树合并

    整理一下线段树合并的思路,大体是给每个树上节点分配一个根编号建一棵log长的权值线段树,一开始树上只有这个树节点的节点权 merge两个树节点的时候,对于当前合并的值域(例如两棵线段树的表示1到n/2 ...

  8. bzoj 2631: tree

    Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 2928  Solved: 975 [Submit][Status][Discuss] Descrip ...

  9. BZOJ 2631 tree(动态树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2631 [题目大意] 要求支持链修改,链查询,边断开,连接操作 [题解] 链修改分乘和加 ...

  10. 一些奇妙的线段树操作

    学过数据结构和会做题完全是两个概念orz 各种各样的题目都应该见识一下 简单的目录: 最大连续长度 吉司机线段树 线段树合并/分裂 最大连续长度问题 典型题目:HDU 3911 ($Black$ $A ...

最新文章

  1. linux安装oracle常见错误 总结
  2. (转载)IIS安装配置全过程
  3. 如何用EFCore Lazy Loading实现Entity Split
  4. python键_Python键盘按键模拟
  5. 共享打印机从网络访问此计算机,win7连接共享打印机时出现,你没有权限访问网络资源...
  6. 贝叶斯网络(Belief Networks)--模型及方法
  7. ai中如何插入签名_如何在PDF文件中插入手写签名?手把手教会你,轻松设置签名...
  8. SECS/GEM协议开发应用
  9. java计算2个日期的天数时间差
  10. 【11月18日截稿】【高校支持】第三届机器人、智能控制与人工智能国际学术会议-RICAI 2021...
  11. Hot and cold pages
  12. CKEditor 4.x 批量图片上传插件
  13. 谷歌AAB 安装到手机或者模拟器上
  14. 2021数据分析师薪资大PK
  15. Java创建线程(Lambda表达式创建线程)
  16. python爬虫之静态网页(以当当网图书畅销榜榜为例)
  17. sql server 2000安装程序配置服务器失败
  18. 华三接入交换机链路聚合组配置
  19. 20亿行21.3G的文本数据打乱操作只需要2.2G的内存执行19分钟
  20. 深挖智邦国际生产制造ERP系统的现状

热门文章

  1. 拓端tecdat|在R语言和Stan中估计截断泊松分布
  2. 拓端tecdat|r语言ggplot2误差棒图快速指南
  3. css基础知识汇总3
  4. docker重启容器
  5. python中tolist()命令
  6. Error response from daemon: OCI runtime exec failed: exec failed: container_linux.go:345:
  7. Linux网络编程和套接字
  8. java程序内存加载_java内存加载机制
  9. 服务器虚拟机镜像怎么设置ip,风云OL虚拟机镜像一键服务端+配套客户端+启动教程+GM命令+IP修改等...
  10. 复旦大学计算机a类专业,如何看待浙大A类学科39个,全国第一,录取分却比复旦、上交低?...