bzoj 2212 Tree Rotations
题目大意:
一棵二叉树,所有非叶子节点都有两个孩子
在每个叶子节点上有一个权值 可以任意交换每个非叶子节点的左右孩子
要求进行一系列交换,使得最终所有叶子节点的权值按照顺序写出来,逆序对个数最少
思路:
建立权值线段树
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相关推荐
- 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf
文章目录 [HNOI2012]永无乡 Lomsat gelral 「POI2011 R2 Day2」旋转树木 Tree Rotations Escape Through Leaf 线段树合并与 fhq ...
- 【BZOJ2212】【POI2011】Tree Rotations(线段树合并)
Description click me Solution 对于每个节点有一棵权值线段树,向上递归时合并同时计算逆序对即可. Source /***************************** ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- Tree Rotations HYSBZ - 2212
https://www.lydsy.com/JudgeOnline/problem.php?id=2212 线段树合并核心代码就是merge 学过线段树一看就明白了 这道题虽然是裸题 但不看题解的话题 ...
- bzoj 1468 Tree(点分治模板)
1468: Tree Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1527 Solved: 818 [Submit][Status][Discus ...
- [BZOJ 2654]tree(陈立杰)
Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...
- [Poi2011]Tree Rotations线段树合并
整理一下线段树合并的思路,大体是给每个树上节点分配一个根编号建一棵log长的权值线段树,一开始树上只有这个树节点的节点权 merge两个树节点的时候,对于当前合并的值域(例如两棵线段树的表示1到n/2 ...
- bzoj 2631: tree
Time Limit: 30 Sec Memory Limit: 128 MB Submit: 2928 Solved: 975 [Submit][Status][Discuss] Descrip ...
- BZOJ 2631 tree(动态树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2631 [题目大意] 要求支持链修改,链查询,边断开,连接操作 [题解] 链修改分乘和加 ...
- 一些奇妙的线段树操作
学过数据结构和会做题完全是两个概念orz 各种各样的题目都应该见识一下 简单的目录: 最大连续长度 吉司机线段树 线段树合并/分裂 最大连续长度问题 典型题目:HDU 3911 ($Black$ $A ...
最新文章
- linux安装oracle常见错误 总结
- (转载)IIS安装配置全过程
- 如何用EFCore Lazy Loading实现Entity Split
- python键_Python键盘按键模拟
- 共享打印机从网络访问此计算机,win7连接共享打印机时出现,你没有权限访问网络资源...
- 贝叶斯网络(Belief Networks)--模型及方法
- ai中如何插入签名_如何在PDF文件中插入手写签名?手把手教会你,轻松设置签名...
- SECS/GEM协议开发应用
- java计算2个日期的天数时间差
- 【11月18日截稿】【高校支持】第三届机器人、智能控制与人工智能国际学术会议-RICAI 2021...
- Hot and cold pages
- CKEditor 4.x 批量图片上传插件
- 谷歌AAB 安装到手机或者模拟器上
- 2021数据分析师薪资大PK
- Java创建线程(Lambda表达式创建线程)
- python爬虫之静态网页(以当当网图书畅销榜榜为例)
- sql server 2000安装程序配置服务器失败
- 华三接入交换机链路聚合组配置
- 20亿行21.3G的文本数据打乱操作只需要2.2G的内存执行19分钟
- 深挖智邦国际生产制造ERP系统的现状
热门文章
- 拓端tecdat|在R语言和Stan中估计截断泊松分布
- 拓端tecdat|r语言ggplot2误差棒图快速指南
- css基础知识汇总3
- docker重启容器
- python中tolist()命令
- Error response from daemon: OCI runtime exec failed: exec failed: container_linux.go:345:
- Linux网络编程和套接字
- java程序内存加载_java内存加载机制
- 服务器虚拟机镜像怎么设置ip,风云OL虚拟机镜像一键服务端+配套客户端+启动教程+GM命令+IP修改等...
- 复旦大学计算机a类专业,如何看待浙大A类学科39个,全国第一,录取分却比复旦、上交低?...