【bzoj2212&3702】二叉树
线段树合并入门题。
分别计算左子树的逆序对,右子树的逆序对,合并的时候计算贡献。
#include<bits/stdc++.h>
#define N 8000005
using namespace std;
typedef long long ll;
int n,sz,tot,cnt=;
ll cnt1,cnt2,ans;
int val[N],ls[N],rs[N],rt[N],sumv[N],l[N],r[N];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
void intree(int x){
val[x]=read();
if(!val[x]){
l[x]=++cnt;intree(l[x]);
r[x]=++cnt;intree(r[x]);
}
}
inline void pushup(int o){sumv[o]=sumv[ls[o]]+sumv[rs[o]];}
void build(int &o,int l,int r,int v){
if(!o)o=++cnt;if(l==r){sumv[o]=;return;}
int mid=(l+r)>>;
if(v<=mid)build(ls[o],l,mid,v);
else build(rs[o],mid+,r,v);
pushup(o);
}
int merge(int x,int y){
if(!x)return y;if(!y)return x;
cnt1+=(ll)sumv[rs[x]]*sumv[ls[y]];
cnt2+=(ll)sumv[ls[x]]*sumv[rs[y]];
ls[x]=merge(ls[x],ls[y]);
rs[x]=merge(rs[x],rs[y]);
pushup(x);return x;
}
void solve(int x){
if(!x)return;
solve(l[x]);solve(r[x]);
if(!val[x]){
cnt1=cnt2=;
rt[x]=merge(rt[l[x]],rt[r[x]]);
ans+=min(cnt1,cnt2);
}
}
int main(){
n=read();cnt++;
intree();
for(int i=;i<=cnt;i++)if(val[i])build(rt[i],,n,val[i]);
solve();
printf("%lld\n",ans);
return ;
}
【bzoj2212&3702】二叉树的更多相关文章
- bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并
Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...
- bzoj3702二叉树 线段树合并
3702: 二叉树 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 600 Solved: 272[Submit][Status][Discuss] ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj3702/bzoj2212 二叉树 (线段树合并)
用线段树记每个子树中包含的数,然后合并的时候算出来逆序对的数量(合并a,b时,就是size[ch[a][1]]*size[ch[b][0]]),来决定这个子树要不要翻转 #include<bit ...
- BZOJ2212 [Poi2011]Tree Rotations 线段树合并 逆序对
原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html 题目传送门 - BZOJ2212 题意概括 给一棵n(1≤n≤200000个叶子的二叉树, ...
- BZOJ2212 [Poi2011]Tree Rotations 【线段树合并】
题目链接 BZOJ2212 题解 一棵子树内的顺序不影响其与其它子树合并时的答案,这一点与归并排序的思想非常相似 所以我们只需单独处理每个节点的两棵子树所产生的最少逆序对即可 只有两种情况,要么正序要 ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- [bzoj3702/2212][Poi2011]二叉树/Tree Rotations_线段树
二叉树 Tree Rotations bzoj-3702 bzoj-2212 Poi-2011 题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节点,满足 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
随机推荐
- kafka java动态获取topic并动态创建消费者
1.获取所有topic package com.example.demo; import java.io.IOException; import java.util.List; import org. ...
- UVA 11881 Internal Rate of Return(数学+二分)
In finance, Internal Rate of Return (IRR) is the discount rate of an investment when NPV equals zero ...
- 打包成exe程序
https://blog.csdn.net/harvic880925/article/details/27675073 当然针对这种exe文件,也可以解压出来得到具体的debug文件夹下的内容.
- NHibernate3.3.3 学习笔记1
前言 昨天在园友的介绍下,我找了一本学习NHibernate的书:<NHibernate 3 Beginner’s Guide>. 第一章我直接跳过了,因为是英文版的看起来很吃力,且第一章 ...
- ArcGIS API for javascript中搜索框的使用问题
我们在开发中常常需要用搜索框去搜索地图上的某个数据,然后在地图上显示出来.这个时候我们要用到esri.dijit.Search().在设置里面的sources的时候,需要注意一点:必须要使用在线的fe ...
- 第一个Spring小程序实战
ps:本文偏向原理和操作性,原理适合于任何编译器. 支持Spring入门,目的是在xml文件里面装配相关bean(java对象),并实现获取.(IOC) 一.先建立一个Spring新项目,添加mave ...
- PokeCats开发者日志(四)
现在是PokeCats游戏开发的第八天的上午,感觉游戏做得差不多了,来写一下开发者日志吧! (1)增加闯关模式,一共30关. (2)更改了最后一关的主题,更换了背景,将树桩改为礼物盒. ...
- 从零开始配置Jenkins(一)——基本配置
[背景] 由于项目变动,需要重新搭建jenkins环境,并在新搭建的平台下进行配置.之前,小编只是照猫画虎的用jenkins手动构建,虽然也维护过一段时间,但对于其中的原理并不是很了解.这下可好了,学 ...
- [Elasticsearch] 多字段搜索 (三) - multi_match查询和多数字段
multi_match查询 multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询. NOTE 存在几种类型的multi_match查询,其中的3种正好和在"了解你的数据 ...
- c++ 中反正单词用到了resize()
resize(n) 调整容器的长度大小,使其能容纳n个元素.如果n小于容器的当前的size,则删除多出来的元素.否则,添加采用值初始化的元素. 题目如下: 151. Reverse Words in ...