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\)个叶子节点,满足这些权值为 ...
随机推荐
- c++入门之浅拷贝和深拷贝
关于这方面的知识:见一篇精辟博文:https://blog.csdn.net/feitianxuxue/article/details/9275979
- PAT L2-009 抢红包
https://pintia.cn/problem-sets/994805046380707840/problems/994805066890854400 没有人没抢过红包吧…… 这里给出N个人之间互 ...
- tomcat7 server.xml max thread
java - Tomcat - maxThreads vs maxConnections - Stack Overflowhttps://stackoverflow.com/questions/246 ...
- pip Read timed out 和 pip 源
解决方法,设置超时时间 pip --default-timeout=100 install -U Pillow 安装时指定源(--index-url) #例如安装scipy时使用豆瓣的源 pip in ...
- Windows10下安装VMware虚拟机并搭建CentOS系统环境
转载: http://blog.51cto.com/10085711/2069270 操作系统 Windows 10专业版(64位) VMware虚拟机 产品:VMware® Workstation ...
- webdriver原理、协议
1.webdriver client的原理是什么? 当测试脚本启动firefox的时候,selenium-webdriver 会首先在新线程中启动firefox浏览器.如果测试脚本指定了firefox ...
- 使用PL/SQL连接Oracle时报错ORA-12541: TNS: 无监听程序
因公司需求,安装oracle数据库,oracle数据库用账号密码可以登录,然后在pl/sql里面不能登录,显示无监听程序. 这就说明可能有些服务没有启动,开始运行services.msc ,进入后寻找 ...
- JQuery/JS select标签动态设置选中值、设置禁止选择 button按钮禁止点击 select获取选中值
//**1.设置选中值:(根据索引确定选中值)**// var osel=document.getElementById("selID"); //得到select的ID var o ...
- 在linux上安装spark详细步骤
在linux上安装spark ,前提要部署了hadoop,并且安装了scala. 提君博客原创 对应版本 >>提君博客原创 http://www.cnblogs.com/tijun/ ...
- AdminLTE 前端框架
适合运维平台 后台管理系统 AdminLTE 是一个开源的后台控制面板和仪表盘 WebApp 模板. 这是一个快速的HTML模板,基于CSS框架的引导. 文档: http://adminlte.la ...