题目链接

  神奇的线段树合并qwq   不过就思路而言很好想……

  观察到一棵树无论怎么交换两棵左右子树,子树内部的最优逆序对并没影响……决策只影响左右子树之间的逆序对……

  于是线段树合并直接乱搞就好啦

  

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#define mid ((l+r)>>1)
#define check(x) if(x==0) x=++tot;
#define maxn 400200
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} long long ls[maxn];
long long rs[maxn];
long long q[maxn];
long long root[maxn];
long long lc[maxn*];
long long rc[maxn*];
long long tree[maxn*];
long long f[maxn];
long long c,w;
long long ans;
long long n,tot,cnt; inline void pushup(long long rt){ tree[rt]=tree[lc[rt]]+tree[rc[rt]]; } void update(long long o,long long l,long long r,long long &rt){
check(rt);
if(l==r){
tree[rt]++; return;
}
if(o<=mid) update(o,l,mid,lc[rt]);
else update(o,mid+,r,rc[rt]);
pushup(rt);
} void gettree(long long &x){
x=++cnt;
q[x]=read();
if(q[x]) return;
gettree(ls[x]);
gettree(rs[x]);
return;
} long long merge(long long x,long long y){
if(x==) return y;
if(y==) return x;
c+=tree[rc[x]]*tree[lc[y]];
w+=tree[lc[x]]*tree[rc[y]];
lc[x]=merge(lc[x],lc[y]);
rc[x]=merge(rc[x],rc[y]);
pushup(x);
return x;
} void calc(long long x){
if(q[x]) return;
calc(ls[x]);
calc(rs[x]);
c=w=;
root[x]=merge(root[ls[x]],root[rs[x]]);
ans+=min(c,w);
return;
} void build(long long x){
if(q[x]){
update(q[x],,n,root[x]);
return;
}
build(ls[x]);
build(rs[x]);
return;
} long long Root; int main(){
n=read();
gettree(Root);
build();
calc();
printf("%lld",ans);
return ;
}

最新文章

  1. jquery的animate({})动画整理
  2. CSS实战中经常出现的问题。
  3. Node 连接Mysql并进行增删改查
  4. SQLServer基本操作
  5. SU Demo之01MakingData--02MultiShot
  6. Android核心分析之十五Android输入系统之输入路径详解
  7. Qt源代码分析
  8. 学习理论之正则化(Regularization)与模型选择
  9. 精《记叙“tom”4年的软件开发之旅》
  10. [转]基于Spring + Spring MVC + Mybatis 高性能web构建
  11. android Handler及消息处理机制的简单介绍
  12. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-模块管理按子系统进行分类管理
  13. 20180821 Python学习笔记:如何获取当前程序路径
  14. dict的基本使用
  15. Swift3 获取当前连接WIFI名称
  16. C语言学习笔记 (003) - C/C++中的实参和形参(转)
  17. 使用 ASMCMD 工具管理ASM目录及文件
  18. mySQL教程 第1章 数据库设计
  19. iOS WKWebview 网页开发适配指南
  20. 100款免费的旅游素材(PSD)

热门文章

  1. SAP CRM Survey调查问卷的存储模型
  2. Django 的母板及布局(Bootstrap)
  3. linux ecrypt decrypt
  4. 标签中的name属性和ID属性的区别
  5. MySQL - INSERT 集合
  6. H5 移动APP - 面包店
  7. k8s搭建WebUI--Dashborad管理界面
  8. 如何下载并安装 robomongo 到Ubuntu 系统
  9. Python使用gevent实现协程
  10. manjaro18 配置国内镜像源