题目链接

【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;
}

「POI2011 R2 Day2」Tree Rotations【线段树合并】的更多相关文章

  1. LOJ 3066 - 「ROI 2016 Day2」快递(线段树合并+set 启发式合并)

    LOJ 题面传送门 人傻常数大,需要狠命卡--/wq/wq 画个图可以发现两条路径相交无非以下两种情况(其中红色部分为两路径的重叠部分,粉色.绿色的部分分别表示两条路径): 考虑如何计算它们的贡献,对 ...

  2. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  3. bzoj2212[Poi2011]Tree Rotations [线段树合并]

    题面 bzoj ans = 两子树ans + min(左子在前逆序对数, 右子在前逆序对数) 线段树合并 #include <cstdio> #include <cstdlib> ...

  4. BZOJ2212 [Poi2011]Tree Rotations 线段树合并 逆序对

    原文链接http://www.cnblogs.com/zhouzhendong/p/8079786.html 题目传送门 - BZOJ2212 题意概括 给一棵n(1≤n≤200000个叶子的二叉树, ...

  5. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

  6. Bzoj P2212 [Poi2011]Tree Rotations | 线段树合并

    题目链接 通过观察与思考,我们可以发现,交换一个结点的两棵子树,只对这两棵子树内的节点的逆序对个数有影响,对这两棵子树以外的节点是没有影响的.嗯,然后呢?(っ•̀ω•́)っ 然后,我们就可以对于每一个 ...

  7. [bzoj2212]Tree Rotations(线段树合并)

    解题关键:线段树合并模板题.线段树合并的题目一般都是权值线段树,因为结构相同,求逆序对时,遍历权值线段树的过程就是遍历所有mid的过程,所有能求出所有逆序对. #include<iostream ...

  8. bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并

    Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...

  9. bzoj2212 Tree Rotations 线段树合并+动态开点

    题目传送门 思路: 区间合并线段树的题,第一次写,对于一颗子树,无论这个子树怎么交换,都不会对其他子树的逆序对造成影响,所以就直接算逆序对就好. 注意叶子节点是1到n的全排列,所以每个权值都只会出现1 ...

随机推荐

  1. ios键盘弹起 body的高度拉长,页面底部空白问题。ios软键盘将页面抵到上面后,关闭软键盘页面不回弹的问题。

    js 监听ios手机键盘弹起和收起的事件 /* js 监听ios手机键盘弹起和收起的事件 */ document.body.addEventListener('focusin', () => { ...

  2. 数据库管理工具DataGrip使用总结(一)

    DataGrip是JetBrains公司推出的管理数据库的产品,对于JetBrains公司,开发者肯定都不陌生,IDEA和ReSharper都是这个公司的产品,用户体验非常不错. 下载地址:https ...

  3. 高并发系统保护~ing

    由于公司业务发展,需要考虑一些高并发系统保护的问题,整理记录一下. 当发现你的系统出现访问卡顿,服务器各种性能指标接近100%(如果一个初创型企业系统正常运行情况下出现这个问题,那么应该恭喜你,你懂得 ...

  4. 在Docker中体验数据库之Mongodb

    本文记录一下,在docker中安装Mongodb的过程. 环境:物理机 ubuntu18.04 因为环境变了,我在一台物理机上直接安装了ubuntu(非虚拟机和双系统),制作U盘镜像.安装参考:htt ...

  5. MyDAL - like && not like 条件 使用

    索引: 目录索引 一.API 列表 C# 代码中 String.Contains("conditionStr") 生成 SQL 对应的 like '%conditionStr%' ...

  6. Spark MLlib FPGrowth关联规则算法

    一.简介 FPGrowth算法是关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息.在算法中使用了一种称为频繁模式树(Frequent ...

  7. (二)图数据neo4j基本认识

    1.neo4j介绍 Neo4j是由Java和Scala实现的开源NoSQL图数据库.自2003年开始研发,直到2007年正式发布第一版.Neo4j的源代码托管在GitHub上,技术支持托管在Stack ...

  8. hbase 过滤器 rowfilter

    HBase为筛选数据提供了一组过滤器,通过这个过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行 ...

  9. Win7环境 搭建IIS环境。发布asp.net MVC项目到IIS(第一期)

    一.右键添加网站,输入网站基本配置信息. 二.成功添加网站后,应用程序池里会多一个应用,版本一定要改成4.0,并且模式是集成模式,否则项目报错(原因可以看配置文件中的版本信息). 三.再启用项目时可能 ...

  10. CentOS7.x编译安装zabbix4.0

    编译安装zabbix Zabbix简介 Zabbix 是一个企业级的分布式开源监控方案. Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件.Zabbix使用灵活的通知机制,允许用户 ...