题意:

  给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求叶子遍历序的逆序对最少。

分析:

  求逆序对我们可以想到权值线段树,所以我们对每个点建一颗线段树(为了避免空间爆炸,采取动态开点的科技)

  两个子节点可以交换,于是我们可以递归,自底向上贪心解决问题,每次线段树合并,在合并时,统计交换左右子节点后,横跨当前位置的逆序对数量,以及不交换子节点的情况下的这个数量,将更优的计入答案。这道问题就圆满解决了。

代码:

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
struct node{ll v;int ls,rs;}t[N*];
int n,m,tot=,cnt=,nm[N],ls[N],rs[N],rt[N];
ll ans=,ans1,ans2;
void read(int x){
scanf("%d",&nm[x]);
if(!nm[x]) read(ls[x]=++cnt),
read(rs[x]=++cnt);return ;
} void update(int &x,int l,int r,int v){
if(!x) x=++tot;int mid=l+r>>;
if(l==r){t[x].v=;return ;}
if(v<=mid) update(t[x].ls,l,mid,v);
else update(t[x].rs,mid+,r,v);
t[x].v=t[t[x].rs].v+t[t[x].ls].v;
} int merge(int x,int y){
if(!x||!y) return x|y;
ans1+=(ll)t[t[x].rs].v*t[t[y].ls].v;
ans2+=(ll)t[t[x].ls].v*t[t[y].rs].v;
t[x].ls=merge(t[x].ls,t[y].ls);
t[x].rs=merge(t[x].rs,t[y].rs);
t[x].v=t[t[x].ls].v+t[t[x].rs].v;
return x;
} void dfs(int x){
if(!x) return ;
dfs(ls[x]);dfs(rs[x]);
if(!nm[x]){
ans1=ans2=;
rt[x]=merge(rt[ls[x]],rt[rs[x]]);
ans+=min(ans1,ans2);
} return ;
} int main(){
scanf("%d",&n);read();
for(int i=;i<=cnt;i++)
if(nm[i]) update(rt[i],,n,nm[i]);
dfs();printf("%lld\n",ans);
return ;
}

线段树合并

最新文章

  1. [JS,Canvas]日历时钟
  2. VS2008 Pocket PC 2003 SE仿真程序上网设置
  3. html_01之基础标签
  4. eclipse执行单元测试报CreateProcess error=87的解决方法
  5. H5文件操作API
  6. 设置oracle_home
  7. wordpress文章ID不连续显示问题的完美解决
  8. 转载 8天掌握EF的Code First开发之Entity Framework介绍
  9. UWP app HelloWorld 的创建
  10. 用JS获取地址栏中的参数的简易方法
  11. laravel 原生 sql
  12. vue 实现图片上传与预览,以及清除图片
  13. Vim和Vi的常用命令
  14. Docker Clustering Tools Compared: Kubernetes vs Docker Swarm
  15. js获取属性
  16. 016 在大数据中,SSH无密钥登录
  17. Shiro学习笔记六(自定义Reaml-使用数据库设置 user roles permissions)
  18. 人脸识别demo使用教程
  19. Apache虚拟主机/端口多开
  20. Codeforces 914 C. Travelling Salesman and Special Numbers (数位DP)

热门文章

  1. SpringMVC数据绑定三(JSON 、XML))
  2. error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [17]”转换为“LPCTSTR”
  3. 类似查询mysql数据库的查询XML的JS类
  4. Tinkoff Challenge - Elimination Round C. Mice problem(模拟)
  5. _bzoj1009 [HNOI2008]GT考试【矩阵加速dp】
  6. _bzoj1012 [JSOI2008]最大数maxnumber【Fenwick Tree】
  7. Neighbor House LightOJ - 1047
  8. 二分查找+数学 HDOJ 4342 History repeat itself
  9. 题解报告:hdu 2030 汉字统计
  10. AsyncTask官方教程-推荐用AsyncTask少用Thread