[POI2011]ROT-Tree Rotations
发现x的子树在后续处理中不会影响逆序对的情况(只关心有哪些值,相对位置已经不重要了)
f[x]表示x为根的子树最小逆序对数
考虑左右儿子交换与否。
暴力是O(n^2)的
考虑线段树合并
左右儿子线段树合并的时候,直接类似于分治,记录另一棵数小于某个数的个数,
选择代价小的放在前面
具体看代码:
1.x,y别写错。。。
2.开long long,而且线段树可能存在一个点的sz大于n,乘起来会爆int
#include<bits/stdc++.h>
#define reg register int
#define mid ((l+r)>>1)
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
int n,ch[*N][];
struct tr{
int ls,rs;
int sz;
}t[*N];
int tot;
void pushup(int x){
t[x].sz=t[t[x].ls].sz+t[t[x].rs].sz;
}
ll xfsz,yfsz;
int rt[*N],m;
ll f[*N];
int merge(int x,int y,int l,int r){
if(!x||!y) return x+y;
if(l==r){
t[x].sz+=t[y].sz;
return x;
}
xfsz+=(ll)t[t[x].rs].sz*t[t[y].ls].sz;
yfsz+=(ll)t[t[y].rs].sz*t[t[x].ls].sz;
t[x].ls=merge(t[x].ls,t[y].ls,l,mid);
t[x].rs=merge(t[x].rs,t[y].rs,mid+,r);
pushup(x);
return x;
}
void upda(int &x,int l,int r,int p){
if(!x) x=++tot;
if(l==r){
t[x].sz=;
return;
}
if(p<=mid) upda(t[x].ls,l,mid,p);
else upda(t[x].rs,mid+,r,p);
pushup(x);
}
void build(int &x){
x=++m;
int val;rd(val);
if(val==){
build(ch[x][]);build(ch[x][]);
}else{
upda(rt[x],,n,val);
}
}
void dfs(int x){
if(ch[x][]&&ch[x][]){
dfs(ch[x][]),dfs(ch[x][]);
// cout<<" back to "<<x<<endl;
xfsz=;yfsz=;
rt[x]=rt[ch[x][]];
rt[x]=merge(rt[x],rt[ch[x][]],,n);
f[x]=f[ch[x][]]+f[ch[x][]]+min(xfsz,yfsz);
// cout<<" xfsz "<<xfsz<<" yfsz "<<yfsz<<endl;
// cout<<" f[x] "<<f[x]<<endl;
}
}
int main(){
rd(n);
int haha;
build(haha);
dfs();
printf("%lld\n",f[]);
return ;
} }
signed main(){
// freopen("4.in","r",stdin);
// freopen("4.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/10 11:57:09
*/
[POI2011]ROT-Tree Rotations的更多相关文章
- 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( 线段树 )
线段树的合并..对于一个点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 分析: 线段树合并. 首先对每个 ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- POI2011 Tree Rotations
POI2011 Tree Rotations 给定一个n<=2e5个叶子的二叉树,可以交换每个点的左右子树.要求前序遍历叶子的逆序对最少. 由于对于当前结点x,交换左右子树,对于范围之外的逆序对 ...
- [bzoj3702/2212][Poi2011]二叉树/Tree Rotations_线段树
二叉树 Tree Rotations bzoj-3702 bzoj-2212 Poi-2011 题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节点,满足 ...
- bzoj 2212 Tree Rotations
bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...
- 线段树合并(【POI2011】ROT-Tree Rotations)
线段树合并([POI2011]ROT-Tree Rotations) 题意 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有nn个叶子节点,满足这些权值为1-n1-n的一个 ...
- bzoj 2212: [Poi2011]Tree Rotations
Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...
- 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并
原文地址:http://www.cnblogs.com/GXZlegend/p/6826614.html 题目描述 Byteasar the gardener is growing a rare tr ...
随机推荐
- excel窗口独立显示/单独显示
天赋异禀的亲,一看就懂!
- 方正 ignb路由器设置备份(自用笔记)
192.168.15.96255.255.255.0192.168.15.1219.232.46.61219.141.136.10
- java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
RabbitMq配置时常见错误 java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper <de ...
- linux命令系列 ls
ls是linux中最常用的命令之一 ls 的功能是list directory contents,其常用的选项如下: (1) -l use a long listing format(长格式,显示 ...
- iOS开发学习-nonatomic和atomic的区别
nonatomic是非原子性的,也就是给线程不加原子锁,这样的代码运行效率会更高一点,例如: @property (nonatomic,copy)NSString *userName; @proper ...
- Beta Scrum Day 7 — 听说
7#听说
- 对TCP/IP网络参数进行调整
对TCP/IP网络参数进行调整 调整TCP/IP网络参数,可以增强抗SYN Flood的能力,命令如下所示:# echo 'net.ipv4.tcp_syncookies = 1' >> ...
- maven编译,控制台中文乱码解决方案
如下图,在使用maven运行后,在控制台看到中文展示乱码 出现这个的原因是源码使用UTF-8,但是maven编译的时候使用GBK标准,如下图 为了让maven编译的时候使用UTF-8标准,使用在p ...
- matlab for 运算的提速
[1]主要思想:matlab是按列存储,定义s(nums,1)比定义s(1,nums)要快哦 需要重复query的元素看看能不能再for之前就定义好 经典案 ...
- IE实现userData 永久存储
注意:只支持IE5,及其以上的浏览器 //需要使用 if 条件注释 <!DOCTYPE html> <html> <head> <meta charset ...