题目背景

这是一道模板题

可以使用bitset,CDQ分治,K-DTree等方式解决。

题目描述

有 nn 个元素,第 ii 个元素有 a_iai​、b_ibi​、c_ici​ 三个属性,设 f(i)f(i) 表示满足 a_j \leq a_iaj​≤ai​ 且 b_j \leq b_ibj​≤bi​ 且 c_j \leq c_icj​≤ci​ 的 jj 的数量。

对于 d \in [0, n)d∈[0,n),求 f(i) = df(i)=d 的数量

输入格式

第一行两个整数 nn、kk,分别表示元素数量和最大属性值。

之后 nn 行,每行三个整数 a_iai​、b_ibi​、c_ici​,分别表示三个属性值。

输出格式

输出 nn 行,第 d + 1d+1 行表示 f(i) = df(i)=d 的 ii 的数量。

输入输出样例

输入 #1复制

10 3
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1
输出 #1复制

3
1
3
0
1
0
1
0
0
1

说明/提示

1 \leq n \leq 100000, 1 \leq k \leq 2000001≤n≤100000,1≤k≤200000

题解:初学习CDQ分治, 拿来这道三维偏序模板题练练手, 定义f(i)代表 a[j].x <= a[i].x && a[j].y <= a[i].y && a[j].z <= a[i].z 的j的个数.

对应 k = [0,n-1] 输出有多少个i 满足f(i) = k,分别输出.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = ;
ll c[maxn],n,k,cnt[maxn];
int lowbit(int x){return x & (-x);}
void add(int pos,int x){
for(int i = pos;i <= k;i += lowbit(i)){
c[i] += x;
}
}
ll query(int pos){
ll sum = ;
for(int i = pos; i >= ;i -= lowbit(i)){
sum += c[i];
}
return sum;
}
struct node{
int x,y,z,cnt,ans;
bool operator != (const node w)const{ // 重载!=符号,用来判断两个结构体信息是否相同,只判断前三个信息就够了
if(x != w.x || y != w.y || z != w.z)return ;//为1代表不等
else return ;
}
}b[maxn],a[maxn];
int cmpx(node a,node b){//按x排序
if(a.x != b.x)return a.x < b.x;
if(a.y != b.y)return a.y < b.y;
return a.z < b.z;
}
int cmpy(node a,node b){//按y排序
if(a.y != b.y)return a.y < b.y;
return a.z < b.z;
}
void cdq(int l,int r){
if(l == r)return ;
int mid = (l + r) / ;
cdq(l,mid),cdq(mid+,r);
sort(a + l,a + + mid,cmpy);
sort(a + mid + ,a + r + ,cmpy);
int i = mid + ,j = l;
for(;i <= r;i++){
while(a[j].y <= a[i].y && j <= mid){
add(a[j].z,a[j].cnt),j++;
}
a[i].ans += query(a[i].z);
}
for(int i = l;i < j;i++)add(a[i].z,-a[i].cnt);//这一段区间处理完后对树状数组清零
}
int main()
{
cin >> n >> k;
for(int i = ;i <= n;i++){
cin >> b[i].x >> b[i].y >> b[i].z;
}
sort(b+,b++n,cmpx);
int w = ,top = ;
for(int i = ;i <= n;i++){
w++;
if(b[i] != b[i+]){
a[++top] = b[i];
a[top].cnt = w;
w = ;
}
}
cdq(,top);
for(int i = ;i <= n;i++){//f(i)的值为a[i].ans + a[i].cnt - 1, 因为计算是去重了的
cnt[a[i].ans + a[i].cnt - ] += a[i].cnt;//每个a[i] 都满足条件,加上a[i]出现的次数
}
for(int i= ;i < n;i++)cout << cnt[i] << endl;
return ;
}

P3810 【模板】三维偏序(陌上花开)(CDQ分治)的更多相关文章

  1. BZOJ3262: 陌上花开(三维偏序,CDQ分治)

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

  2. HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)

    Jam's problem again Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  3. hdu5618 (三维偏序,cdq分治)

    给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...

  4. P3810 陌上花开 CDQ分治

    陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...

  5. 洛谷P3810 陌上花开 CDQ分治(三维偏序)

    好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...

  6. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

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

  7. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1439  Solved: 648[Submit][Status][Discuss ...

  8. N维偏序:cdq分治

    cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...

  9. bzoj3262陌上花开 cdq分治

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2794  Solved: 1250[Submit][Status][Discus ...

  10. bzoj3262: 陌上花开(cdq分治+树状数组)

    3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...

随机推荐

  1. 三十六、SAP的调试模式

    一.在执行界面,输入/h, 左下角会提示调试模式被激活 二.点击运行,就会跳出调试界面 三.调试界面用法

  2. NumPy 数组创建

    章节 Numpy 介绍 Numpy 安装 NumPy ndarray NumPy 数据类型 NumPy 数组创建 NumPy 基于已有数据创建数组 NumPy 基于数值区间创建数组 NumPy 数组切 ...

  3. CF1209B Koala and Lights

    It is a holiday season, and Koala is decorating his house with cool lights! He owns n lights, all of ...

  4. css 基础知识 (待完善...)

    CSS   1.position 属性     对元素进行定位.       absolute         相对于 非static类型的position 的 第一个(临近的) 父元素 进行定位. ...

  5. 【Java Spring 进阶之路 】1.Spring 是什么?

  6. apicloud - addEventListener 接收不到 sendEvent 的解决方法

    要将 api.addEventListener 放在最前面 , 减少受到其他事件的影响 apiready = function () { api.addEventListener({          ...

  7. JavaScript面试题(转)

    JS相关问题 数组去重 function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++) ...

  8. 实验吧web-易-上传绕过

    随便上传一个png文件,出现提示 我们再上传一个php文件,却出现提示 上传遇到问题是肯定的,题目就是上传绕过,所以我们下面要做的就是绕过检测. 这里使用00截断. 首先在提交时抓包 我们将图中upl ...

  9. StringBuffer和StringBuilder类

    对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类(String类是不可改变的,一旦创建了String对象,那它的值就无法改变了). 和String类不同的是,St ...

  10. part5 城市页面列表开发

    1.配置路由 先在router文件夹中,创建一个路由.引入组件 { path: '/city', name: 'HelloCity', component: city, meta: { name: ' ...