BZOJ2212 [POI2011] Tree Rotations 【treap】
题目分析:
写的无旋treap应该跑不过,但bzoj判断的总时限。把相关实现改成线段树合并就可以了。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int n;
int ch[maxn][],num,val[maxn]; int son[maxn>>][],sz[maxn],rot[maxn],data[maxn],key[maxn]; long long ans = ; int merge(int r1,int r2){
if(r1 == ) return r2; if(r2 == ) return r1;
if(key[r1] < key[r2]){
son[r1][] = merge(son[r1][],r2);
sz[r1] = sz[son[r1][]]+sz[son[r1][]]+;
return r1;
}else{
son[r2][] = merge(r1,son[r2][]);
sz[r2] = sz[son[r2][]]+sz[son[r2][]]+;
return r2;
}
}
pair<int,int> split(int rt,int k){
if(k == ) return make_pair(,rt);
if(k >= sz[rt]) return make_pair(rt,);
if(sz[son[rt][]] >= k){
pair<int,int> res = split(son[rt][],k);
son[rt][] = res.second; res.second = rt;
sz[rt] = sz[son[rt][]] + sz[son[rt][]] + ;
return res;
}else{
pair<int,int> res = split(son[rt][],k-sz[son[rt][]]-);
son[rt][] = res.first; res.first = rt;
sz[rt] = sz[son[rt][]] + sz[son[rt][]] + ;
return res;
}
}
int found(int now,int x){
if(now == ) return ;
if(data[now] == x) return sz[son[now][]];
if(data[now] < x) return sz[son[now][]]++found(son[now][],x);
else return found(son[now][],x);
} void dfs(int now){
int d; scanf("%d",&d);
if(d){val[now] = d; return;}
ch[now][] = ++num; dfs(num); ch[now][] = ++num; dfs(num);
} long long alpha,beta;
void walk(int A,int B){
int z = found(B,data[A]); alpha += z; beta += (sz[B]-z);
if(son[A][]) walk(son[A][],B);
if(son[A][]) walk(son[A][],B);
} void dfs2(int A,int &B){
if(son[A][]) dfs2(son[A][],B),son[A][] = ;
if(son[A][]) dfs2(son[A][],B),son[A][] = ;
sz[A] = ; int z = found(B,data[A]);
pair<int,int> pr = split(B,z);
B = merge(merge(pr.first,A),pr.second);
} void dfs1(int now){
if(val[now]){
num++;
key[num]=rand();
sz[num]=;
data[num]=val[now];
rot[now]=num;
return;
}
dfs1(ch[now][]); dfs1(ch[now][]);
alpha = ,beta = ;
if(sz[rot[ch[now][]]] < sz[rot[ch[now][]]]){
walk(rot[ch[now][]],rot[ch[now][]]);
dfs2(rot[ch[now][]],rot[ch[now][]]);
rot[now] = rot[ch[now][]];
}else {
walk(rot[ch[now][]],rot[ch[now][]]);
dfs2(rot[ch[now][]],rot[ch[now][]]);
rot[now] = rot[ch[now][]];
}
ans += min(alpha,beta);
} void read(){
scanf("%d",&n);
num = ;
dfs();
} void work(){
num = ;
dfs1();
printf("%lld",ans);
} int main(){
read();
work();
return ;
}
BZOJ2212 [POI2011] Tree Rotations 【treap】的更多相关文章
- BZOJ2212 [Poi2011]Tree Rotations 【线段树合并】
题目链接 BZOJ2212 题解 一棵子树内的顺序不影响其与其它子树合并时的答案,这一点与归并排序的思想非常相似 所以我们只需单独处理每个节点的两棵子树所产生的最少逆序对即可 只有两种情况,要么正序要 ...
- BZOJ2212: [Poi2011]Tree Rotations
2212: [Poi2011]Tree Rotations Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 391 Solved: 127[Submi ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- BZOJ2212 [Poi2011]Tree Rotations 线段树合并 逆序对
原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html 题目传送门 - BZOJ2212 题意概括 给一棵n(1≤n≤200000个叶子的二叉树, ...
- bzoj2212[Poi2011]Tree Rotations [线段树合并]
题面 bzoj ans = 两子树ans + min(左子在前逆序对数, 右子在前逆序对数) 线段树合并 #include <cstdio> #include <cstdlib> ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...
- 2212: [Poi2011]Tree Rotations
2212: [Poi2011]Tree Rotations https://www.lydsy.com/JudgeOnline/problem.php?id=2212 分析: 线段树合并. 首先对每个 ...
- POI2011 Tree Rotations
POI2011 Tree Rotations 给定一个n<=2e5个叶子的二叉树,可以交换每个点的左右子树.要求前序遍历叶子的逆序对最少. 由于对于当前结点x,交换左右子树,对于范围之外的逆序对 ...
随机推荐
- 深入理解Redis高可用方案-Sentinel
Redis Sentinel是Redis的高可用方案.是Redis 2.8中正式引入的. 在之前的主从复制方案中,如果主节点出现问题,需要手动将一个从节点升级为主节点,然后将其它从节点指向新的主节点, ...
- Java面试MySQL的一些问题
MySQL InnoDB存储的文件结构 索引树是如何维护的? 数据库自增主键可能的问题
- 将 ASP.NET Core 2.0 项目升级至 ASP.NET Core 2.1.3X
在上一篇文章ASP.Net Core 运行错误 Http Error 502.5 解决办法的最后有提到说,最推荐的升级办法是从2.0升级到2.1X版本. 操作如下 项目的例子直接使用https://g ...
- Quartz-Spring定时任务器持久化,通过Service动态添加,删除,启动暂停任务
原文地址:https://blog.csdn.net/ljqwstc/article/details/78257091 首先添加maven的依赖: <!--quartz定时任务--> &l ...
- ubuntu中搭建svn服务器步骤
1.安装软件包: sudo apt-get install subversion 2.建立相关文件夹(这里svn放在home文件夹中) cd /home sudo mkdir svn cd /home ...
- Day7 Ubantu学习(一)
Linux是多用户操作系统 Ubantu学习参考网址:https://www.cnblogs.com/resn/p/5800922.html 1.虚拟机网络类型的理解 bridged(桥接模式) : ...
- [2017BUAA软工助教]团队开发阶段CheckList
alpha阶段流程与相关节点 以下流程与团队项目中个人的得分点是一一对应的,详见QA文档中"个人在团队项目的得分部分" http://www.cnblogs.com/Childis ...
- 第四章 MyBatis-SQL映射文件
MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 SQL映射文件的几个顶级元素(按照定义的顺序) mapper - namespace cache - 配置 ...
- java总结:Java中获取系统时间(年、月、日)以及下拉菜单默认选择系统年、月、日的方法
<!-- 获取系统当前的年.月.日 --> <%@ page import="java.util.*"%> <% Calendar calendar= ...
- C99标准的柔性数组 (Flexible Array)
[什么是柔性数组(Fliexible Array)] 柔性数组在C99中的定义是: 6.7.2.1 Structure and union specifiers As a special case, ...