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\)个叶子节点,满足这些权值为 ...
随机推荐
- Python学习第十六篇——异常处理
在实际中,很多时候时候,我们并不能保证我们所写的程序是完美的.比如我们程序的本意是:用户在输入框内输入数字,并进行后续数学运算,即使我们提醒了用户需要输入数字而不是文本,但是有时会无意或者恶意输入字符 ...
- Consecutive Subsequence CodeForces - 977F (map优化DP)·
You are given an integer array of length nn. You have to choose some subsequence of this array of ma ...
- Of Study
Bacon Reading maketh a full man; conference a ready man; and writing an exact man. And therefore, if ...
- semantic-ui 表单
1.定义表单 先看一个基础的表单,再讲解一下: <form class="ui form" method="post" action="&quo ...
- css小demo
span{ color: #ccc; float: right; font-weight: bold; display: inline-block; border-right: solid 1px # ...
- linux安装php7.2.7
1.下载php 官网下载:#wget http://cn2.php.net/get/php-7.2.7.tar.gz/from/a/mirror.(ps:应该是这么下载的,但是我下载的都是一个mirr ...
- js 首次进入弹窗
今天有个需求,首次进入需要弹窗,然后就在网上找了下,虽然看了很多但是说的都不是我想要的,最后终于到了一个合适的. function get_cookie(Name) { var search = Na ...
- jdbc一点小笔记
JDBC的常用接口的步骤, 1使用Driver或者Class.forName()进行注册驱动: 2使用DriverManager进行获取数据库的链接.使用Connection获取语句对象.使用语句对象 ...
- Python——Radiobutton,Checkbutton参数说明
anchor : 文本位置: background(bg) : 背景色: foreground(fg) :前景色: borderwidth : 边框宽度: width : 组件的宽度: hei ...
- Redux学习(2) ----- 异步和中间件
Redux中间件,其实就是一个函数, 当我们发送一个action的时候,先经过它,我们就可以对action进行处理,然后再发送action到达reducer, 改变状态,这时我们就可以在中间件中,对a ...