原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html


题目传送门 - BZOJ2212


题意概括

  给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少。


题解

  线段树合并。

  博主很懒,题解不写了。

  这份代码是仿照别人的写的。


代码

#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int N=200005;
int n,val[N*2],son[N*2][2],tot=0,rt;
int root[N*2],ls[N*2*20],rs[N*2*20];
LL sum[N*2*20];
void dfsread(int &x){
x=++tot;
scanf("%d",&val[x]);
if (!val[x]){
dfsread(son[x][0]);
dfsread(son[x][1]);
}
}
void pushup(int rt){
sum[rt]=sum[ls[rt]]+sum[rs[rt]];
}
LL sumL,sumR;
void add(int &rt,int L,int R,int v){
rt=++tot;
int mid=(L+R)>>1;
if (L==R){
sum[rt]=1;
return;
}
if (v<=mid)
add(ls[rt],L,mid,v);
else
add(rs[rt],mid+1,R,v);
pushup(rt);
}
int merge(int a,int b){
if (!a||!b)
return a+b;
sumL+=sum[rs[a]]*sum[ls[b]];
sumR+=sum[ls[a]]*sum[rs[b]];
ls[a]=merge(ls[a],ls[b]);
rs[a]=merge(rs[a],rs[b]);
pushup(a);
return a;
}
LL dfs(int x){
LL ans=0;
if (!val[x]){
ans=dfs(son[x][0])+dfs(son[x][1]);
sumL=sumR=0;
root[x]=merge(root[son[x][0]],root[son[x][1]]);
ans+=min(sumL,sumR);
}
else
add(root[x],1,n,val[x]);
return ans;
}
int main(){
scanf("%d",&n);
dfsread(rt);
printf("%lld",dfs(rt));
return 0;
}

  

BZOJ2212 [Poi2011]Tree Rotations 线段树合并 逆序对的更多相关文章

  1. bzoj2212[Poi2011]Tree Rotations [线段树合并]

    题面 bzoj ans = 两子树ans + min(左子在前逆序对数, 右子在前逆序对数) 线段树合并 #include <cstdio> #include <cstdlib> ...

  2. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  3. bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并

    Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...

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

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

  5. Bzoj P2212 [Poi2011]Tree Rotations | 线段树合并

    题目链接 通过观察与思考,我们可以发现,交换一个结点的两棵子树,只对这两棵子树内的节点的逆序对个数有影响,对这两棵子树以外的节点是没有影响的.嗯,然后呢?(っ•̀ω•́)っ 然后,我们就可以对于每一个 ...

  6. BZOJ_2212_[Poi2011]Tree Rotations_线段树合并

    BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...

  7. [POI2011]ROT-Tree Rotations 线段树合并|主席树 / 逆序对

    题目[POI2011]ROT-Tree Rotations [Description] 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为 ...

  8. [bzoj2212]Tree Rotations(线段树合并)

    解题关键:线段树合并模板题.线段树合并的题目一般都是权值线段树,因为结构相同,求逆序对时,遍历权值线段树的过程就是遍历所有mid的过程,所有能求出所有逆序对. #include<iostream ...

  9. BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )

    线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...

随机推荐

  1. MySQL查询语句练习题,测试基本够用了

    Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...

  2. Day8--------------RPM包管理

    nginx.tar.gz:源码,编译安装 RPM:redhat package manage,二进制 增.删.查 1.增 package------>ls|less------------> ...

  3. dubbo常用网址

    https://dubbo.gitbooks.io/dubbo-user-book/content/references/protocol/dubbo.html http://dubbo.apache ...

  4. .htaccess技巧: URL重写(Rewrite)与重定向

    URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上.有关htacces ...

  5. VUE 图片验证码

    1. 概述 1.1 说明 在开发过程中,有时候需要使用图片验证码进行增加安全强度,在点击图片时更新新的图片验证码,记录此功能,以便后期使用. 2. 示例 2.1 vue示例代码 <templat ...

  6. JS将图片转换成Base64码

    直接上代码 html页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  7. 44)django-环境变量设置

    如果外面程序需要调用django,就需要设置django环境指明调用那个项目. # _*_ coding:utf-8 _*_ __author__ = "shisanjun" im ...

  8. functions 示例

    示例1:  ","字符串截取 CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VA ...

  9. Confluence 6 配置索引语言

    修改你 Confluence 的索引语言将有助于你提高搜索的准确性,如果你网站使用的主要语言是除了英语以外的其他语言. Confluence 可以支持下面语言的的内容索引: Arabic Brazil ...

  10. Confluence 6 Confluence 安装目录

    Confluence 安装的目录(Confluence Installation directory)定义的是 Confluence 是在那里进行安装的.这个目录有时候也被称为 Confluence ...