[bzoj3702/2212][Poi2011]二叉树/Tree Rotations_线段树
二叉树 Tree Rotations bzoj-3702 bzoj-2212 Poi-2011
题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1到n的一个排列)。可以任意交换每个非叶子节点的左右孩子。
要求进行一系列交换,使得最终所有叶子节点的权值按照中序遍历写出来,逆序对个数最少。
注释:$2\le n \le 2\cdot 10^5$。
想法:显然,对于一个节点的两个儿子lson和rson,无论lson和rson内部如何操作,任何两个数x和y,满足lson是x的祖先,rson是y的祖先且x>y,按照这样构成的逆序对是不会因为内部操作而消失的,同样地,也不会平白无故增加。所以一个节点pos的操作与不操作是独立的,我们只需要将当前当前节点的两颗子树之间的逆序对数维护到最小,显然就是最优解。这样我们对每一个点维护左右逆序对数和区间和,然后自底向上操作。这个过程用线段树模拟。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
using namespace std;
#define N 400010
typedef long long ll;
int n,sz,seg;
ll ans,cnt1,cnt2;
int v[N],l[N],r[N],root[N];
int sum[N*10],ls[N*10],rs[N*10];
void readtree(int pos)
{
scanf("%d",&v[pos]);
if(!v[pos])
{
l[pos]=++sz;
readtree(l[pos]);
r[pos]=++sz;
readtree(r[pos]);
}
}
void pushup(int pos)
{
sum[pos]=sum[ls[pos]]+sum[rs[pos]];
}
void build(int &pos,int l,int r,int val)
{
if(!pos)pos=++seg;
if(l==r){sum[pos]=1;return;}
int mid=(l+r)>>1;
if(val<=mid)build(ls[pos],l,mid,val);
else build(rs[pos],mid+1,r,val);
pushup(pos);
}
int merge(int x,int y)
{
if(!x)return y;
if(!y)return x;
cnt1+=(ll)sum[rs[x]]*sum[ls[y]];
cnt2+=(ll)sum[ls[x]]*sum[rs[y]];
ls[x]=merge(ls[x],ls[y]);
rs[x]=merge(rs[x],rs[y]);
pushup(x);
return x;
}
void solve(int pos)
{
if(!pos)return;
solve(l[pos]);solve(r[pos]);
if(!v[pos])
{
cnt1=cnt2=0;
root[pos]=merge(root[l[pos]],root[r[pos]]);
ans+=min(cnt1,cnt2);
}
}
int main()
{
scanf("%d",&n);
++sz;
readtree(1);
for(int i=1;i<=sz;i++)
if(v[i])build(root[i],1,n,v[i]);
solve(1);
printf("%lld\n",ans);
return 0;
}
小结:超级喜欢的一道题,先从小引理入手,然后再进行一系列思考。
[bzoj3702/2212][Poi2011]二叉树/Tree Rotations_线段树的更多相关文章
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...
- 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/3702 [Poi2011]Tree Rotations 线段树合并
Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...
- BZOJ2212 [Poi2011]Tree Rotations 线段树合并 逆序对
原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html 题目传送门 - BZOJ2212 题意概括 给一棵n(1≤n≤200000个叶子的二叉树, ...
- BZOJ2212【POI2011】ROT:Tree Rotation 线段树合并
题意: 给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求叶子遍历序的逆序对最少. 分析: 求逆序对我们可以想到权值线段树,所以我们对每个点建一颗线段树(为了避免空间爆炸,采 ...
- bzoj2212[Poi2011]Tree Rotations [线段树合并]
题面 bzoj ans = 两子树ans + min(左子在前逆序对数, 右子在前逆序对数) 线段树合并 #include <cstdio> #include <cstdlib> ...
随机推荐
- Redis学习和应用记录(2)--常用数据类型及命令
这一节主要介绍Redis支持的数据结构及常用命令. 数据类型 Redis支持多种数据类型的存储,包括字符,列表,集合,有续集合,哈希表,bit数组,超级日志等.下面分别介绍: strings:存储普通 ...
- Linux运维人员-服务器组成硬件基础
第1章 1.1关于运维人员 1.1.1 运维的职责 数据不能丢 网站7*24小时运行 保证用户体验(用户体验要好) 1.1.2 运维原则 简单.易用.高效 === 简单.粗暴 1.2 服务器 1.2 ...
- thinkphp调试手段
使用ThinkPHP应该掌握的调试手段经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉ThinkPHP内置的调试手段和方法,抛开IDE本身 ...
- 洛谷P1387最大正方形(dp,前缀和)
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...
- [App Store Connect帮助]二、 添加、编辑和删除用户(4)更改用户的 App 访问权限
您可以限制具有“App 管理”.“客户支持”.“开发者”.“营销”或“销售”职能的用户(均不具有“访问报告”职能)拥有哪些 App 的访问权限.如果您不更改他们的用户 App 访问权限,他们将默认拥有 ...
- [Swift通天遁地]八、媒体与动画-(14)使用TextKit快速实现文章的分栏效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- HTML--form表单中的label标签
小伙伴们,你们在前面学习表单各种控件的时候,有没有发现一个标签--label,这一小节就来揭晓它的作用. label标签不会向用户呈现任何特殊效果,它的作用是为鼠标用户改进了可用性.如果你在 labe ...
- SVD 学习笔记
本文主要学习了这篇博客:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html,将SVD讲的恨透 ...
- Django与 Ajax
什么是json? 定义: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子 ...
- React容器组件和展示组件
Presentational and Container Components 展示组件 - 只关心它们的样子. - 可能同时包含子级容器组件和展示组件,一般含DOM标签和自定的样式. ...