对于二维偏序,为普通的求逆序对,只需要先排序一遍,然后树状数组或双指针即可

而三位偏序甚至更高,则需要用 CDQ 分治,简单来说,就是将树状数组和双指针结合

操作步骤如下:

  • 1.开始将数组按第一维排序,保证满足 x 性质
  • 2.在归并中,将左右分别按 y 排序,因为开始以 x 排序,所以保证了正确性,保证贡献从左到右
  • 3.相当于用树状数组处理二维偏序,再用双指针合并左右两部分数组即可
#include <bits/stdc++.h>
#define int long long using namespace std; const int N = 200010; int n, k;
struct rua
{
int x, y, z;
int res, cnt;
} a[N];
int tr[N], res[N]; bool check(int x, int y)
{
return (a[x].x == a[y].x && a[x].y == a[y].y && a[x].z == a[y].z);
} bool cmpx(rua x, rua y)
{
if (x.x != y.x) return x.x < y.x;
else if (x.y != y.y) return x.y < y.y;
return x.z < y.z;
} bool cmpy(rua x, rua y)
{
if (x.y != y.y) return x.y < y.y;
return x.z < y.z;
} int lowbit(int x)
{
return x & -x;
} void update(int x, int v)
{
for (int i = x; i <= k; i += lowbit(i)) tr[i] += v;
} int query(int x)
{
int res = 0;
for (int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
} void solve(int l, int r)
{
if (l == r) return;
int mid = l + r >> 1;
solve(l, mid), solve(mid + 1, r);
sort(a + l, a + mid + 1, cmpy);
sort(a + mid + 1, a + r + 1, cmpy);
int i = mid + 1, j = l;
while (i <= r)
{
while (a[j].y <= a[i].y && j <= mid) update(a[j].z, a[j].cnt), j ++ ;
a[i].res += query(a[i].z);
i ++ ;
}
for (int i = l; i < j; i ++ ) update(a[i].z, -a[i].cnt);
} signed main()
{
cin >> n >> k;
for (int i = 1; i <= n; i ++ ) cin >> a[i].x >> a[i].y >> a[i].z; sort(a + 1, a + 1 + n, cmpx);
// for (int i = 1; i <= n; i ++ ) cout << a[i].x << ' ' << a[i].y << ' ' << a[i].z << '\n';
int cnt = 0;
for (int i = 1; i <= n; i ++ )
{
int j = i + 1;
while (check(i, j)) j ++ ;
j -- ;
a[ ++ cnt] = {a[i].x, a[i].y, a[i].z, 0, j - i + 1};
i = j;
}
// for (int i = 1; i <= n; i ++ )
// cout << a[i].cnt << ' ';
// cout << '\n'; solve(1, n); for (int i = 1; i <= n; i ++ ) res[a[i].res + a[i].cnt - 1] += a[i].cnt; for (int i = 0; i < n; i ++ ) cout << res[i] << '\n'; return 0;
}

算法学习-CDQ分治的更多相关文章

  1. 【算法】CDQ分治 -- 三维偏序 & 动态逆序对

    初次接触CDQ分治,感觉真的挺厉害的.整体思路即分而治之,再用之前处理出来的答案统计之后的答案. 大概流程是(对于区间 l ~ r): 1.处理 l ~mid, mid + 1 ~ r 的答案: 2. ...

  2. 算法复习——cdq分治

    题目: Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要 ...

  3. 算法笔记--CDQ分治 && 整体二分

    参考:https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 前置技能:树 ...

  4. CDQ分治学习思考

    先挂上个大佬讲解,sunyutian1998学长给我推荐的mlystdcall大佬的[教程]简易CDQ分治教程&学习笔记 还有个B站小姐姐讲解的概念https://www.bilibili.c ...

  5. BZOJ1173 CDQ分治 笔记

    目录 二维数据结构->cdq 预备知识 T1: 二维树状数组 T2:cdq分治 bzoj1176 mokia:Debug心得 一类特殊的CDQ分治 附: bzoj mokia AC代码 二维数据 ...

  6. 陌上花开(三维偏序)(cdq分治)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 其实就是三位偏序的模板,cdq分治入门题. 学习cdq分治请看__stdcall大 ...

  7. 【BZOJ3237】【AHOI2013】连通图 [CDQ分治]

    连通图 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input Output Sampl ...

  8. CDQ 分治

    引言: 什么是CDQ分治?其实这是一种思想而不是具体算法,因此CDQ分治覆盖的范围相当广泛,在 OI 界初见于陈丹琦 2008 年的集训队作业中,故被称为CDQ分治. 大致分为三类: cdq分治解决与 ...

  9. P3810 【模板】三维偏序(陌上花开)(CDQ分治)

    题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai​.b_ibi​.c_ici​ 三个属性,设 f(i) ...

  10. 【算法学习】【洛谷】cdq分治 & P3810 三维偏序

    cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...

随机推荐

  1. Java SE 文件上传和文件下载的底层原理

    1. Java SE 文件上传和文件下载的底层原理 @ 目录 1. Java SE 文件上传和文件下载的底层原理 2. 文件上传 2.1 文件上传应用实例 2.2 文件上传注意事项和细节 3. 文件下 ...

  2. 新版宝塔面板快速搭建WordPress新手教程

    一.宝塔面板介绍 1. 介绍 宝塔面板是一款服务器管理软件,支持Windows和Linux系统,可以通过Web端轻松管理服务器,提升运维效率,该软件内置了创建管理网站.FTP.数据库.可视化文件管理器 ...

  3. ceph 001 存储类型 传统存储与分布式存储 分布式文件系统 集群与分布式

    ceph 存储类型 块存储:裸磁盘 未被格式化的磁盘 DAS(直连存储,usb,硬盘插到电脑):scsi接口 接口数量有限 传输距离有限 SAN(存储区域网络):ip-san 网络(iscsi) 以太 ...

  4. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-62 - 判断元素是否可操作

    1.简介 有些页面元素的生命周期如同流星一闪,昙花一现.我们也不知道这个元素在没在页面中出现过,为了捕获这一美好瞬间,让其成为永恒.我们就来判断元素是否显示出现过. 在操作元素之前,可以先判断元素的状 ...

  5. SpringBoot配置过滤器、拦截器

    拦截器概述 Spring Boot提供了一种简单且强大的方式来定义和使用拦截器(Interceptor).Spring Boot的拦截器基于Spring框架的拦截器机制,可以在请求的处理过程中插入自定 ...

  6. 【Quartz】

    一.Quartz概述 Quartz是用来做定时任务调度的JavaEE框架 需求场景: 1.在每个月末,自动网易云会员续费,或者百度云盘会员续费 2.在迅雷下载完一个超过10G的资源的30秒之后自动关机 ...

  7. 代码随想录Day3

    203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 1: 输入:head = [1 ...

  8. 伪代码中ties broken arbitrarily是什么含义?

    最近在看一个物联网的论文,论文的伪代码中有这么一个地方标有:ties broken arbitrarily,对这个写法有些搞不清楚含义,于是网上找到了下面的资料: https://www.zhihu. ...

  9. 题解:CF780B The Meeting Place Cannot Be Changed

    这道题一看就是 二分 板子题. 当然由于精度原因,最好由原来的二分模板转换成这个. while ((w - t) > 0.000001) { mid = (t + w) / 2.0 ; if ( ...

  10. 结合实例看 maven 传递依赖与优先级,难顶也得上丫

    开心一刻 想买摩托车了,但是钱不够,想找老爸借点 我:老爸,我想买一辆摩托车,上下班也方便 老爸:你表哥上个月骑摩托车摔走了,你不知道?还要买摩托车? 我:对不起,我不买了 老板:就是啊,骑你表哥那辆 ...