洛谷3521 [POI2011]ROT-Tree Rotations(线段树合并)
题意:给定一颗有 n 个叶节点的二叉树。每个叶节点都有一个权值pi(注意,根不是叶节点),所有叶节点的权值构成了一个1∼n 的排列。对于这棵二叉树的任何一个结点,保证其要么是叶节点,要么左右两个孩子都存在。现在你可以任选一些节点,交换这些节点的左右子树。在最终的树上,按照先序遍历遍历整棵树并依次写下遇到的叶结点的权值构成一个长度为 n的排列,你需要最小化这个排列的逆序对数。
输入格式:第一行是一个整数 n,表示树的叶节点个数。接下来若干行,使用递归的形式来读入这棵树,读入任意一个子树的信息时,初始时读入其根节点。对于一个结点 u,首先有一行一个整数 x。若 x≠0,则表示 u 是一个叶节点,其权值为 x。若 x = 0,则表示 u 不是叶节点,则接下来若干行读入其左子树信息,左子树读入结束后接下来若干行读入其右子树信息。
输出格式:输出一行一个整数表示最小的逆序对数。
分析:假设当前点的左右儿子分别为ls,rs,很容易发现,交换以这两个结点为根节点的子树,并不会影响他们的祖宗交换时逆序对的个数。所以我们可以考虑每一层贪心地进行交换,此时局部最优即全局最优。同时,对于区间[L,R],设其中点为mid,我们只需要考虑这样的逆序对(x,y),满足L ≤ x ≤ mid,mid+1 ≤ y ≤ R即可,并不需要考虑在同一个子树中的逆序对数量。由于这是权值线段树,那么逆序对其实很好统计,对于两颗线段树代表同一段区间的两个节点,考虑交换与不交换两种情况,分别取左、右部分或者右、左部分统计逆序对个数。最后取最小值就可以了。
#include<cstdio>
const int maxn = 2e5+5; typedef long long ll; int n, x, cnt;
int sum[maxn << 5], ls[maxn << 5], rs[maxn << 5];
ll ans, s1, s2;
int rt[maxn]; inline ll min(ll a, ll b) { return a < b ? a : b; } void ins(int &u, int l, int r, int pos){
if(!u) u = ++cnt; ++sum[u];
if(l == r) { return ; }
int mid = (l + r) >> 1;
if(pos <= mid) ins(ls[u], l, mid, pos);
else ins(rs[u], mid + 1, r, pos);
} void merge(int &a, int b){
if(!a || !b) { a = a | b; return ;}
sum[a] += sum[b];
s1 += 1LL * sum[ls[a]] * sum[rs[b]];
s2 += 1LL * sum[rs[a]] * sum[ls[b]];
merge(ls[a], ls[b]);
merge(rs[a], rs[b]);
sum[a] = sum[ls[a]] + sum[rs[a]];
} int dfs(){
scanf("%d", &x);
if(x) return ins(rt[x], 1, n, x), rt[x];
else{
int ls, rs;
ls = dfs(), rs = dfs();
s1 = s2 = 0;
merge(ls, rs);
ans += min(s1, s2);
return ls;
}
} int main(){
scanf("%d", &n);
dfs();
printf("%lld", ans);
return 0;
}
洛谷3521 [POI2011]ROT-Tree Rotations(线段树合并)的更多相关文章
- 【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 线段树合并 逆序对
原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html 题目传送门 - BZOJ2212 题意概括 给一棵n(1≤n≤200000个叶子的二叉树, ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- BZOJ2212【POI2011】ROT:Tree Rotation 线段树合并
题意: 给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求叶子遍历序的逆序对最少. 分析: 求逆序对我们可以想到权值线段树,所以我们对每个点建一颗线段树(为了避免空间爆炸,采 ...
- Bzoj P2212 [Poi2011]Tree Rotations | 线段树合并
题目链接 通过观察与思考,我们可以发现,交换一个结点的两棵子树,只对这两棵子树内的节点的逆序对个数有影响,对这两棵子树以外的节点是没有影响的.嗯,然后呢?(っ•̀ω•́)っ 然后,我们就可以对于每一个 ...
- 洛谷P3066 [USACO12DEC]逃跑的Barn (线段树合并)
题目描述It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to ro ...
- 洛谷P1600 天天爱跑步(线段树合并)
小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn ...
- 洛谷P3224 [HNOI2012]永无乡(线段树合并+并查集)
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- [bzoj2212]Tree Rotations(线段树合并)
解题关键:线段树合并模板题.线段树合并的题目一般都是权值线段树,因为结构相同,求逆序对时,遍历权值线段树的过程就是遍历所有mid的过程,所有能求出所有逆序对. #include<iostream ...
随机推荐
- 让nodejs开启服务更简单--koa篇
在nodejs原始的http模块中,开启一个服务编码相对麻烦,需要对请求方式及上传的数据进行各种判断,而koa给我们提供了比较便捷的编码方式,同时它还有很多中间件可以直接拿来使用. 首先来看,如何 ...
- 应用性能监控工具(pinpoint)部署
Pinpoint是一款全链路分析工具,提供了无侵入式的调用链监控.方法执行详情查看.应用状态信息监控等功能.pinpoint使用HBASE储存数据. 下面介绍pinpoint部署及应用. 1. 安装 ...
- 基于C#的消息处理的应用程序 - 开源研究系列文章
今天讲讲基于C#里的基于消息处理的应用程序的一个例子. 我们知道,Windows操作系统的程序是基于消息处理的.也就是说,程序接收到消息代码定义,然后根据消息代码定义去处理对应的操作.前面有一个博文例 ...
- AVR汇编(七):位操作和MCU控制指令
AVR汇编(七):位操作和MCU控制指令 位操作指令 SBI / CBI SBI 指令用于设置I/O寄存器中的第 b 位, CBI 指令用于清除I/O寄存器中的第 b 位. 例如: SBI DDRB, ...
- Win11+ VS2022编译 FFmpeg6.0 静态库
目录 编译前言 为什么项目编译? 前期准备 环境配置 ffmpeg外部库 额外的编译选项-for渲染 opengl (需要glext) ffnvcodec (需要nv-codec-headers) A ...
- 【技术积累】Java里的volatile关键字到底能干嘛?
7.4 最害怕的一集 - volatile 7.4.1 最简单的一集 - volatile 语义 (难度 : ) 读 -> 读一个 volatile 必须从 主内存读 写 -> 写一个 v ...
- Django模板(请用Django2.0版本完成)
1. 在learn目录下新建一个templates文件夹,里面新建一个home.html (1) 很简单的,就直接右键learn,新建文件夹,完成后,继续右键templates,创建文档,后缀名为ht ...
- (2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]
/提示:如果你看到了这行文字,那说明您的预览器不支持内嵌 CSS 代码,请使用 VSCode 阅读本 Markdown 文件/ 每天一个技术点 (2023.7.15)软件加密与解密-番外1-PWN2R ...
- 领域驱动设计(DDD):DDD落地问题和一些解决方法
欢迎继续关注本系列文章,下面我们继续讲解下DDD在实战落地时候,会具体碰到哪些问题,以及解决的方式有哪些. DDD 是一种思想,主要知道我们方向,具体如何做,需要我们根据业务场景具体问题具体分析. 充 ...
- 云上的甜蜜早安:腾讯云云函数助力PHP打造女友专属每日推送
用腾讯云的云函数做一个微信公众号早安,每天定时发送早安给你的女朋友! 1.首先我们登录腾讯云,在搜索栏搜索云函数,或直接用这个链接进入curl.qcloud.com/Td0IkpmD 2.进入云函数, ...