算法学习-CDQ分治
对于二维偏序,为普通的求逆序对,只需要先排序一遍,然后树状数组或双指针即可
而三位偏序甚至更高,则需要用 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分治的更多相关文章
- 【算法】CDQ分治 -- 三维偏序 & 动态逆序对
初次接触CDQ分治,感觉真的挺厉害的.整体思路即分而治之,再用之前处理出来的答案统计之后的答案. 大概流程是(对于区间 l ~ r): 1.处理 l ~mid, mid + 1 ~ r 的答案: 2. ...
- 算法复习——cdq分治
题目: Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要 ...
- 算法笔记--CDQ分治 && 整体二分
参考:https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 前置技能:树 ...
- CDQ分治学习思考
先挂上个大佬讲解,sunyutian1998学长给我推荐的mlystdcall大佬的[教程]简易CDQ分治教程&学习笔记 还有个B站小姐姐讲解的概念https://www.bilibili.c ...
- BZOJ1173 CDQ分治 笔记
目录 二维数据结构->cdq 预备知识 T1: 二维树状数组 T2:cdq分治 bzoj1176 mokia:Debug心得 一类特殊的CDQ分治 附: bzoj mokia AC代码 二维数据 ...
- 陌上花开(三维偏序)(cdq分治)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 其实就是三位偏序的模板,cdq分治入门题. 学习cdq分治请看__stdcall大 ...
- 【BZOJ3237】【AHOI2013】连通图 [CDQ分治]
连通图 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description Input Output Sampl ...
- CDQ 分治
引言: 什么是CDQ分治?其实这是一种思想而不是具体算法,因此CDQ分治覆盖的范围相当广泛,在 OI 界初见于陈丹琦 2008 年的集训队作业中,故被称为CDQ分治. 大致分为三类: cdq分治解决与 ...
- P3810 【模板】三维偏序(陌上花开)(CDQ分治)
题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai.b_ibi.c_ici 三个属性,设 f(i) ...
- 【算法学习】【洛谷】cdq分治 & P3810 三维偏序
cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...
随机推荐
- AT_abc215_d 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 给定 \(N\),\(M\) 及含有 \(N\) 个整数的序列 \(A\). 求 \( ...
- JMeter Sampler-http请求之KeepAlive使用总结
Sampler-http请求之KeepAlive使用总结 测试环境 apache-jmeter-2.13 KeepAlive使用介绍 说明: 1.Use KeepAlive 勾上,则表示为求连接设置请 ...
- 【ue源码】定制-蓝图部分
今天在更新UE的伤害系统的时候出现了一个问题: 多个地方频繁调用一个函数,而这个函数肯定做优化,具体就是,把对应数据放入到队列,另外一个地方慢慢消费这个队列, 那么问题出现了,我使用的UE只有Sing ...
- gist.github.com 无法访问解决办法,亲测永远有效!
1.打开https://www.ipaddress.com/,输入gist.github.com获取IP地址 2.ping 此ip地址,可以访问 3.将IP地址写入Hosts文件,140.82.113 ...
- mybatis:映射方式与SQL注入
1.映射方式有两种,一种是resultType 这个是有一个实体类其成员与数据库中表字段一一对应,下例中就是User类对应了user表 <mapper namespace="com.e ...
- python yield关键字作用
python yield关键字作用 1,是当前对象变成一个可迭代对象 def frange(start,stop,step): x = start while x<stop: yield x x ...
- 测试环境配置https+端口访问留存
步骤1:阿里云DNS配置本地公网IP解析 步骤2:本地局域网192.168.1.10服务器配置nginx server { listen 8090 ssl; server_name localhost ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-61 - 隐藏元素定位与操作
1.简介 对于前端隐藏元素,一直是自动化定位元素的隐形杀手,让人防不胜防.脚本跑到隐藏元素时位置时报各种各样的错误,可是这种隐藏的下拉菜单又没有办法避免,所以非常头痛,这一篇只为交流隐藏元素自动化定位 ...
- 【YAML】非标记语言的标记语言
什么是YAML? YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写. 在开发的这种语言时,YAML 的意思其实是:&qu ...
- 【官网链接】 REPRODUCIBILITY —— pytorch的可复现性
官网链接地址: https://pytorch.org/docs/stable/notes/randomness.html ====================================== ...