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

而三位偏序甚至更高,则需要用 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. oeasy教您玩转vim - 46 - # 范围控制

    ​ 范围控制 回忆上节课内容 这次我们主要就是看命令行 首先是选择一个 [range] 这个范围 然后进行相应的操作 :11,30d :2,7y 还可以指定寄存器 :"a3,40y :&qu ...

  2. Day 3 - 单调栈、单调队列、凸包与斜率优化

    单调栈 引入 何为单调栈?顾名思义,单调栈即满足单调性的栈结构.与单调队列相比,其只在一端进行进出. 为了描述方便,以下举例及伪代码以维护一个整数的单调递增栈为例. 过程 插入 将一个元素插入单调栈时 ...

  3. 解决IE11兼容问题的一些心得

    IE11中,都不支持es6新特性. vue想要兼容IE11不要写箭头函数, UI框架不要写有箭头的回调函数(编译成es5的时候,会通不过), 使用label将es6编译成es5. 使用typescri ...

  4. P6680 [CCO2019] Marshmallow Molecules 题解

    P6680 题意 一个 \(n\) 点 \(m\) 边的图,图无重边,无自环. 满足这样一条性质:如果三边互不相等,则三边可以构成三角形. 思路 思路简单,用集合的思想来做. 引用一下 K0stlin ...

  5. scanf、cin及其优化、快读性能测试

    为了让大家了解C++各种IO方式的性能,于是就有了这篇文章. 本次测试采取的数据均为 \(10^6\) 个不超过 \(10^8\) 随机正整数. 测试代码: #include<bits/stdc ...

  6. JavaScript中的new map()和new set()使用详细(new map()和new set()的区别)

    简介:new Map(): 在JavaScript中,new Map()用于创建一个新的 Map 对象.Map 对象是一种键值对的集合,其中的键是唯一的,值可以重复.new Set(): 在JavaS ...

  7. 【Mybatis】06 Session获取 & 配置参数总结

    会话获取 SqlSessionFactory 最佳的获取方式就是使用Mybatis提供的资源类加载配置文件 调用会话工厂建造者实例的建造方法注入读取流 要注意的是建造者生成了了实例就可以不需要了 这里 ...

  8. 【Spring-Security】Re05 权限控制及403处理

    一.访问控制方法及控制项: 上述配置中的URL后面都离不开的一个访问控制抉择: 1.全部允许 PermiAll 2.全部拒绝 DenyAll 3.允许匿名访问 Anonymous 也就是普通访问者 4 ...

  9. 【Layui】10 颜色选择器 ColorPicker

    文档地址: https://www.layui.com/demo/colorpicker.html 常规选择器: <fieldset class="layui-elem-field l ...

  10. 乌克兰学者的学术图谱case5

    ========================================== 背景: 弗兰采维奇材料问题研究是欧洲最大的材料科研院所,在核电.航空.航天.军工及其他装备制造领域的先进材料研制方 ...