题目链接

【BZOJ】
【洛谷】
【LOJ】

题解

由于是前序遍历,那么讨论一棵树上的逆序对的情况。

  • 两个节点都在左子树上
  • 两个节点都在右子树上
  • 两个节点分别在不同的子树上。

前两种情况其实也可以归结于第三种情况。

原因

因为两个节点不可能占据一个位置。
根据容斥原理,为了保证答案的正确性,我们递归求解不能计算两遍相同的答案。

回到正题
所以我们只需要讨论跨越两个子树的情况。
很显然,左子树中的所有点的\(dfs\)序都比右子树的子树中的小。
那么如果要交换,就是相反一下。
比较容易可以想到对于每一个节点都先建立一个权值线段树。
那么每一次的答案就从线段树的左子树和右子树中取最小值就可以了。

代码

#include <bits/stdc++.h>
using namespace std;
namespace IOstream {
    #define gc getchar
    template <typename T>
    inline void read(T &x) {
        x = 0; T fl = 1; char c = 0;
        for (; c < '0' || c > '9'; c = gc())
            if (c == '-') fl = -1;
        for (; c >= '0' && c <= '9'; c = gc())
            x = (x << 1) + (x << 3) + (c ^ 48);
        x *= fl;
    }
    #undef gc
} using namespace IOstream;
typedef long long ll;
const int N = 4000005 + 6;
int n, cnt = 0, tot = 0;
int rt[N];
ll ans, f, g;
struct node {
    int lc, rc, sz;
} tr[N];
int merge(int x, int y) {
    if (!x || !y) return x + y;
    f += 1ll * tr[tr[x].lc].sz * 1ll * tr[tr[y].rc].sz;
    g += 1ll * tr[tr[y].lc].sz * 1ll * tr[tr[x].rc].sz;
    tr[x].lc = merge(tr[x].lc, tr[y].lc);
    tr[x].rc = merge(tr[x].rc, tr[y].rc);
    tr[x].sz += tr[y].sz;
    return x;
}
void ins(int nod, int l, int r, int k) {
    tr[nod].sz ++;
    if (l == r) return;
    int mid = (l + r) >> 1;
    if (k <= mid) tr[nod].lc = ++ tot, ins(tr[nod].lc, l, mid, k);
    else tr[nod].rc = ++ tot, ins(tr[nod].rc, mid + 1, r, k);
}
#undef ls
#undef rs
int dfs() {
    int w; read(w);
    if (w) {
        rt[++ cnt] = ++ tot;
        ins(rt[cnt], 1, n, w);
        return rt[cnt];
    } else {
        int nod = merge(dfs(), dfs());
        ans += min(f, g);
        f = g = 0;
        return nod;
    }
}
int main() {
    read(n); ans = 0ll;
    dfs();
    printf("%lld\n", ans);
    return 0;
}

最新文章

  1. CSS3多列/多卷
  2. 大神的Blog挂了,从Bing快照里复制过来的备份
  3. javascript数据结构与算法--高级排序算法
  4. http://blog.sina.com.cn/s/blog_4c3b6a070100etad.html
  5. java中的static详解
  6. Python基础、 内置函数
  7. Redis的Python客户端redis-py的初步使用
  8. Linux_系统信息
  9. 1107. Social Clusters (30)
  10. Javascript访问css样式信息
  11. 第一篇:APUE-操作系统IO模型
  12. Linux和windows动态库
  13. UICollectionView 简单的使用和注意事项
  14. windows phone 获取手机图片库中图片(4)
  15. 搭建一个BS 的简单SOA 架构(直接通过jquery 调用后台的 wcf 服务的架构)(第一天)
  16. 关于MongoDB数据库中文件唯一性的问题
  17. 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)
  18. Understanding the Objective-C Runtime
  19. Parhaps you are running on a JRE rather than a JDK?
  20. [IoC容器Unity]第一回:Unity预览

热门文章

  1. 生鲜配送管理系统_升鲜宝V2.0 供应商协同系统设计思想及设计效果展现(一)
  2. MySQL安装之yum安装
  3. OpenCL洗牌函数shuffle
  4. jquery实现静态柱形图(写死的数据,只为系统首页UI更美观)
  5. Spark MLlib FPGrowth关联规则算法
  6. Java Memory Management
  7. NT路径,DOS路径和Device路径互相转换
  8. PHP 函数漏洞总结
  9. linux的自有(内置)服务
  10. scrapy 命令行基本用法