bzoj2212[Poi2011]Tree Rotations [线段树合并]
题面
ans = 两子树ans + min(左子在前逆序对数, 右子在前逆序对数)
线段树合并
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#define Sqr(x) ((x)*(x))
using namespace std;
const int N = 2e5 + 5;
const int M = 4e6 + 5;
long long cnt1, cnt2;
struct Seg{
int w[M], sz, ls[M], rs[M];
void ins(int l, int r, int x, int &rt){
if(!rt) rt = ++sz;
if(l == r) {w[rt] = 1; return ;}
int mid = l + ((r - l) >> 1);
if(x <= mid) ins(l, mid, x, ls[rt]);
else ins(mid + 1, r, x, rs[rt]);
w[rt] = w[ls[rt]] + w[rs[rt]];
}
int merge(int x, int y){
if(!x || !y) return x + y;
cnt1 += 1ll * w[ls[x]] * w[rs[y]];
cnt2 += 1ll * w[rs[x]] * w[ls[y]];
ls[x] = merge(ls[x], ls[y]);
rs[x] = merge(rs[x], rs[y]);
w[x] = w[ls[x]] + w[rs[x]];
return x;
}
}seg;
int n, m, sz, rt[N << 2], l[N << 2], r[N << 2], w[N << 2];
void init(int &cur){
cur = ++sz;
scanf("%d", &w[cur]);
if(!w[cur]) {init(l[cur]); init(r[cur]);}
else seg.ins(1, n, w[cur], rt[cur]);
}
long long solve(int cur){
if(w[cur]) return 0;//如果不在叶子节点停下 叶子就会被合并成空树
long long res = solve(l[cur]) + solve(r[cur]);
//printf("%d %lld %d %d\n", cur, res, l[cur], r[cur]);
cnt1 = cnt2 = 0;
rt[cur] = seg.merge(rt[l[cur]], rt[r[cur]]);
//printf("%lld %lld\n", cnt1, cnt2);
return res + min(cnt1, cnt2);
}
int main() {
scanf("%d", &n);
init(m);
printf("%lld\n", solve(m));
//system("PAUSE");
return 0;
}
/*
检查所有的int函数是否有返回值
*/
bzoj2212[Poi2011]Tree Rotations [线段树合并]的更多相关文章
- BZOJ2212 [Poi2011]Tree Rotations 线段树合并 逆序对
原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html 题目传送门 - BZOJ2212 题意概括 给一棵n(1≤n≤200000个叶子的二叉树, ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- Bzoj P2212 [Poi2011]Tree Rotations | 线段树合并
题目链接 通过观察与思考,我们可以发现,交换一个结点的两棵子树,只对这两棵子树内的节点的逆序对个数有影响,对这两棵子树以外的节点是没有影响的.嗯,然后呢?(っ•̀ω•́)っ 然后,我们就可以对于每一个 ...
- bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并
Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...
- [bzoj2212]Tree Rotations(线段树合并)
解题关键:线段树合并模板题.线段树合并的题目一般都是权值线段树,因为结构相同,求逆序对时,遍历权值线段树的过程就是遍历所有mid的过程,所有能求出所有逆序对. #include<iostream ...
- BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...
- [POI2011]ROT-Tree Rotations 线段树合并|主席树 / 逆序对
题目[POI2011]ROT-Tree Rotations [Description] 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为 ...
随机推荐
- Randomized Online PCA Algorithms with Regret Bounds that are Logarithmic in the Dimension
目录 Setup of Batch PCA and Online PCA Hedge Algorithm 改进算法 用于矩阵 \(rounding()\) 前俩次,都用到了\(rounding()\) ...
- dfs实现数的全排列
代码 #include<bits/stdc++.h> using namespace std; #define ll long long bool vis[15]; int a[15]; ...
- c++入门之再次探讨类属性
精辟博文:https://blog.csdn.net/msdnwolaile/article/details/51923859(转载,仅供学习|!)
- python_format格式化输出、while else、逻辑运算符、编码初识
1.格式化输出 .%d %s 格式化输出:% 占位符,d 表示替换整型数,s表示要替换字符串. name = input('请输入名字:') age = input('请输入年龄:') sex = ...
- 使用Dockerfile来构建镜像
Dockerfile原理 创建Dockerfile Dockerfile实例 Dockerfile指令 注释 FROM MAINTAINER RUN ADD WORKDIR ENV USER COPY ...
- Docker防主机意外断电导致容器实例无法驱动解决方案:UPS || write barrier || 上btrfs定期snapshot
Write barrier - Wikipediahttps://en.wikipedia.org/wiki/Write_barrier R大在在介绍CMS时提到了write barrier写屏蔽的概 ...
- CentOS6.5配置 cron
CentOS6.5配置 cron 任务 - mengjiaoduan的博客 - CSDN博客https://blog.csdn.net/mengjiaoduan/article/details/649 ...
- php trait使用
trait类似于基类 同样的方法优先级为 本类>trait>基类 <?php /** * Created by PhpStorm. * User: mac * Date: 2019 ...
- Lumen与laravel的区别
Lumen与laravel的区别 困惑 一直都无法很友好的理解Lumen与Laravel之间的区别,只知道他们是非常相似的两个php框架,使用方法什么的都差不多. 为什么要解惑 最近接手了公司的一 ...
- Laravel数据库操作的三种方式
http://blog.csdn.net/zls986992484/article/details/52824962