B - Tree Rotations HYSBZ - 2212 (线段树合并)
题目链接:https://cn.vjudge.net/contest/287725#problem/B
题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列)。可以任意交换每个非叶子节点的左右孩子。
要求进行一系列交换,使得最终所有叶子节点的权值按照遍历序写出来,逆序对个数最少。
具体思路:首先说一下对逆序对的处理。2431的逆序数是4((2,1),(4,3),(4,3),(3,1))。但是两个for循环处理肯定是不行的,我们可以通过线段树来求出逆序对数,每插入一个数,就先判断一个这个数在线段树上后面有多少个数就可以了。
第一次插入2,后面没有数,此时逆序对数为0。
第二次插入4,后面没有数,此时的逆序对数为0.
第三次插入3,后面有2这个数,此时的逆序对数为1。
第四次插入1,后米娜有2,3,4这三个数,此时的逆序对数为1+3=4。
然后再就是对于题目中所说的交换操作了。在线段树中每一个节点的逆序对数等于这个节点的左孩子的逆序对数+右孩子的逆序对数+后面的树中的逆序对数
如果是交换当期节点的左右孩子,当前这个点的逆序对数等于左孩子中大于等于当当前节点值的个数*右孩子中小于等于当前节点值的个数。
如果不交换的话,当前这个点的逆序对数等于左孩子中小于等于当前节点值的个数*右孩子中小于等于当前节点值的个数。
ch数组代表的是当前这个节点在初始二叉树中左孩子和右孩子的编号。
cont代表的数当前在线段树上的编号的贡献
le代表的是当前节点左孩子在线段树的编号
ri代表的是当前节点右孩子在线段树的编号
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 4e6+;
const int mod =1e6;
# define LL_inf 0x3f3f3f3f3f3f3f
ll n,root,ans,t1,t2;
ll num1,num2;
ll ch[maxn][];
ll cont[maxn];
ll le[maxn],ri[maxn],father[maxn];
void up(ll x){
cont[x]=cont[le[x]]+cont[ri[x]];
}
void update(ll &x,ll val,ll l,ll r){
if(!x)x=++num2;//如果之前出现过就不需要在新建节点了
if(l==r){
cont[x]=;
return ;
}
ll mid=l+r>>;
if(val<=mid)update(le[x],val,l,mid);
else update(ri[x],val,mid+,r);
up(x);
}
void dfs(ll &x){
x=++num1;
ll tmp;
scanf("%lld",&tmp);
if(!tmp){
dfs(ch[x][]);
dfs(ch[x][]);
}
else update(father[x],tmp,,n);
}
ll emerge(ll u,ll v){
if(!u)return v;
if(!v)return u;
t1+=(cont[le[u]]*cont[ri[v]]);
t2+=(cont[le[v]]*cont[ri[u]]);
le[u]=emerge(le[u],le[v]);
ri[u]=emerge(ri[u],ri[v]);
up(u);
return u;
}
void solve(ll x){
if(!ch[x][])return ;
solve(ch[x][]);
solve(ch[x][]);
t1=,t2=;
father[x]=emerge(father[ch[x][]],father[ch[x][]]);//注意这个是father
ans+=min(t1,t2);
}
int main(){
scanf("%lld",&n);
dfs(root);
solve(root);
printf("%lld\n",ans);
}
B - Tree Rotations HYSBZ - 2212 (线段树合并)的更多相关文章
- 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并
原文地址:http://www.cnblogs.com/GXZlegend/p/6826614.html 题目描述 Byteasar the gardener is growing a rare tr ...
- 【bzoj1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+权值线段树合并
题目描述 求一张图的严格次小生成树的边权和,保证存在. 输入 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z ...
- [学习笔记]dsu on a tree(如何远离线段树合并)
https://www.zybuluo.com/ysner/note/1318613 背景 这玩意来源于一种有局限性的算法. 有一种广为人知的,树上离线维护子树信息的做法. (可以参照luogu360 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- bzoj 2212 : [Poi2011]Tree Rotations (线段树合并)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2212 思路:用线段树合并求出交换左右儿子之前之后逆序对的数量,如果数量变小则交换. 实现 ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- bzoj2212[Poi2011]Tree Rotations [线段树合并]
题面 bzoj ans = 两子树ans + min(左子在前逆序对数, 右子在前逆序对数) 线段树合并 #include <cstdio> #include <cstdlib> ...
- 【BZOJ2212】[POI2011]Tree Rotations (线段树合并)
题解: 傻逼题 启发式合并线段树里面查$nlog^2$ 线段树合并顺便维护一下$nlogn$ 注意是叶子为n 总结点2n 代码: #include <bits/stdc++.h> usin ...
随机推荐
- Day035--Python--管道, Manager, 进程池, 线程切换
管道 #创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process ...
- HDU 4770 Lights Against Dudely(暴力+状压)
思路: 这个题完全就是暴力的,就是代码长了一点. 用到了状压,因为之前不知道状压是个东西,大佬们天天说,可是我又没学过,所以对状压有一点阴影,不过这题中的状压还是蛮简单的. 枚举所有情况,取开灯数最少 ...
- 高级组件——文件选择器JFileChooser
1.创建文件选择器 JFileChooser 2.设置选择模式 setFileSelectionMode(int mode) JFileChooser.FILES_ONLY 只能选择文件(默认) JF ...
- Failed to start Vsftpd ftp daemon错误
配置 vsftpd.conf文件后 重启ftp服务出现 Failed to start Vsftpd ftp daemon错误 总是 启动失败 解决方法 将配置文件中的 listen=YES 改为 l ...
- Vue(基础四)_总结五种父子组件之间的通信方式
一.前言 这篇文章主要总结了几种通信方式: 1.方式一:使用props: [ ]和$emit() (适用于单层通信) 2.方式二:$attrs和$listeners(适用于多层) 3.方式三:中央处 ...
- 8个Python小Tips
原创: 金牌小编 行走在Python的江湖,那能不收藏一些锦囊妙计,今天分享给大家8个小技巧,希望在实战的时候有帮助! 01. 条件判断 condition=Trueif condition: ...
- Java集合、Iterator迭代器和增强for循环整理
集合 集合,集合是java中提供的一种容器,可以用来存储多个数据. 数组的长度是固定的.集合的长度是可变的.集合中存储的元素必须是引用类型数据 1.1 ArrayList集合存储元素 pac ...
- Zabbix Server 自带模板监控无密码MySQL数据库
Zabbix Server 自带模板监控无密码MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装MariaDB 1>.安装MariaDB [root ...
- hadoop 开发环境搭建
一,安装java环境 添加java环境变量 vi /etc/profile # add by tank export JAVA_HOME=/data/soft/jdk/jdk1.7.0_71 ex ...
- java读大文件最快性能【转】
java读大文件最快性能 完全引用自: 几种读大文件方法的效率对比测试 据说1.88g只要5秒左右,未亲测. /** * 读大文件 * BufferedReader + char[] * @throw ...