对于一维偏序, 大概就是直接排序, 一般sort()直接解决;

对于二维偏序,(比如有求逆序对)此时就需要用sort()+暴力降维的方法、或者是sort() + 树状数组来解决;

而对于三维偏序, 就比较麻烦,按我们正常的思维应该是要把三维降成二维,再把二维降成一维。 不难发现可以用sort()排序降1维, 还可以用树状数组维护一维, 那么还审议维怎么办呢? 这就是CDQ算法的精华所在(降维)。——感觉有点类似于分块算法!

Eg: 典型三维偏序

/*//
Problem: P3810 【模板】三维偏序(陌上花开)
Contest:
URL: https://www.luogu.com.cn/problem/P3810
/*/
#include <bits/stdc++.h>
#define ll long long int
#define ull unsigned long long int
using namespace std;
const int inf = 0x3f3f3f3f;
const ll ll_inf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
const int maxn = 1e5 + 5;struct hua {int a, b, c, cnt, ans;
} s1[4 * maxn], s2[4 * maxn];
int n, k, tot, m;
int t[4 * maxn], ans[4 * maxn];bool cmp(hua x1, hua x2) {if (x1.a == x2.a) {if (x1.b == x2.b) {return x1.c < x2.c;}return x1.b < x2.b;}return x1.a < x2.a;
}bool cmp2(hua x1, hua x2) {if (x1.b == x2.b) {return x1.c < x2.c;}return x1.b < x2.b;
}
class Binary {public:int lowbit(int x) {return x & (-x);}void tree_add(int p, int x) {while (p <= k) {t[p] += x;p += lowbit(p);}}int tree_sum(int p) {int res = 0;while (p) {res += t[p];p -= lowbit(p);}return res;}void tree_clear(int l, int r) {for (int i = l; i < r; i ++) {tree_add(s2[i].c, -s2[i].cnt);}}
};void CDQ(int l,  int r) {if (l == r) return ;int mid = l + (r - l) / 2;CDQ(l, mid);CDQ(mid + 1, r);sort(s2 + l, s2 + mid + 1, cmp2);sort(s2 + mid + 1, s2 + r + 1, cmp2);int  j = l;Binary binary;for (int i = mid + 1; i <= r; i++) {while (s2[i].b >= s2[j].b && j <= mid) {binary.tree_add(s2[j].c, s2[j].cnt);j ++;}s2[i].ans += binary.tree_sum(s2[i].c);}binary.tree_clear(l, j);
}int main(int argc, char const *argv[]) {ios::sync_with_stdio(false);cin.tie(0);     cout.tie(0);cin >> n >> k;for (int i = 1; i <= n; i ++)  {cin >> s1[i].a >> s1[i].b >> s1[i].c;}sort(s1 + 1, s1 + 1 + n, cmp); // 第一维// 去重, 合并 就是先把等于的算出来.for (int i = 1; i <= n; i ++) {tot++;if (s1[i].a != s1[i + 1].a || s1[i].b != s1[i + 1].b || s1[i].c != s1[i + 1].c) {m++;//更新元素个数s2[m].a = s1[i].a;s2[m].b = s1[i].b;s2[m].c = s1[i].c;s2[m].cnt = tot;tot = 0;}}// CDQ() 分治CDQ(1, m);for (int i = 1; i <= m; i ++) {ans[s2[i].ans + s2[i].cnt - 1] += s2[i].cnt;}for (int i = 0; i < n; i ++) {cout << ans[i] << endl;}return 0;
}

多维偏序总结(CDQ)相关推荐

  1. HDU5126 stars(4维偏序->cdq套cdq+树状数组)

    stars 题目大意: 在一个三维空间当中,每次进行一个操作,添加一个点或者统计空间中的某一个长方体范围内的所有点 三维空间中我们用两个点即可确定一个长方体. 首先效仿平面二维数点的方法,根据容斥原理 ...

  2. CDQ分治嵌套模板:多维偏序问题

    CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1struct Node{int a,b,c,d,bg;}; ...

  3. 【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】

    题意: n×mn\times mn×m 的网格图,每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j​,bufi,j​,从 (1,1)(1,1)(1,1) ...

  4. CDQ分治解二维偏序

    Stars-POJ 2352 求解没有重复项的包含子集的个数. 我们直接求其贡献,对于一维偏序x坐标进行升序排序,对于二维偏序y坐标进行分治,我们从递归至底层,然后向上更新,对于左右子树,左子树的x一 ...

  5. Nowcoder farm ( 树状数组、二维前缀和、二维偏序 )

    题目链接 分析 : 最简单的想法当然就是去模拟 直接对每个施肥料的操作进行模拟.然后计算贡献 但是这显然会超时.这题需要换一个思维 对于一个土地(也就是二维平面上的一个点)的种类是 T' 如果它被操作 ...

  6. 分治算法,逆序对,三维偏序与CDQ分治

    分治算法基本思想 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出. 对于这类问题,我们往往先把它分解成几个子问题,找到求出 ...

  7. 模型——二维偏序与三维偏序

     蒟蒻不会二维偏序 二维偏序 二维偏序的定义  定义:形如xi<xjx_i<x_jxi​<xj​且yi<yjy_i<y_jyi​<yj​之类的约束条件,我们可以称为 ...

  8. 【数据结构】二维数点/二维偏序

    该内容需要有一定的数据结构基础,前置知识:二维前缀和.树状数组.线段树.扫描线等 二维数点的解法较多,可自行查找和学习其他解法 二维数点简介 二维数点又称二维偏序,它是这样一类问题,给出一个二维平面內 ...

  9. BZOJ 2131 免费的馅饼(DP,二维偏序问题 / 旋转坐标轴转化问题)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2131 是 hydro 的 BZOJ ...

最新文章

  1. 深度学习之卷积神经网络CNN理论与实践详解
  2. qt xml组包_Qt 利用XML文档,写一个程序集合 二
  3. 【异常】INFO: TopologyManager: EndpointListener changed ...
  4. c#启动mysql数据库服务器_c# - 使用C#应用程序连接Web服务器中的mysql数据库
  5. https://sysdig.com/blog/
  6. image 微信小程序flex_微信小程序进阶-flex布局
  7. Linux:程序设计
  8. 方差分析软件_重复测量方差分析的操作教程及结果解读
  9. 大学加权平均分计算器_澳大利亚移民宝藏专业----西澳大学幼教硕士解析
  10. 学生信息管理系统(头哥适用版)(c语言)
  11. 超全园林 景观cc0高清摄影图片素材网站整理
  12. matlab画一元函数图
  13. 二篇、使用excel做数据驱动把数据管理起来
  14. 百度关键词排名查询源码_百度移动搜索关键词排名优化
  15. [2019HDU多校第四场][HDU 6617][D. Enveloping Convex]
  16. 第二节 构成人体必需的营养素
  17. ORACLE EBS
  18. 正在家里愉快办公,突然被通知公司倒闭,员工:没想到来得这么快
  19. <动手学深度学习>之pytorch版本,配置d2lzh_pytorch包
  20. 事件二(.NET事件)

热门文章

  1. Java开源 ERP与客户管理-Sequoia ERP
  2. “熵”详细学习笔记——什么是熵?有什么性质?联合熵等其他熵的作用
  3. html手机端一键复制,一键粘贴复制功能-兼容IE9+及其移动端-clipboard.js
  4. 从0基础到蓝桥杯C/C++B组国奖
  5. 2022第四届长安杯wp
  6. 树莓派 小车java_树莓派小车之前进和后退(创乐博套件)
  7. Rtools 环境变量设置-windows
  8. Android开发k歌软件,安卓电视k歌软件哪个好?
  9. 网络文件共享服务之NFS
  10. kindeditor=4.1.5文件上传漏洞复现