题目背景

这是一道模板题

可以使用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复制

  1. 10 3
  2. 3 3 3
  3. 2 3 3
  4. 2 3 1
  5. 3 1 1
  6. 3 1 2
  7. 1 3 1
  8. 1 1 2
  9. 1 2 2
  10. 1 3 2
  11. 1 2 1
输出 #1复制

  1. 3
  2. 1
  3. 3
  4. 0
  5. 1
  6. 0
  7. 1
  8. 0
  9. 0
  10. 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,分别输出.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn = ;
  5. ll c[maxn],n,k,cnt[maxn];
  6. int lowbit(int x){return x & (-x);}
  7. void add(int pos,int x){
  8. for(int i = pos;i <= k;i += lowbit(i)){
  9. c[i] += x;
  10. }
  11. }
  12. ll query(int pos){
  13. ll sum = ;
  14. for(int i = pos; i >= ;i -= lowbit(i)){
  15. sum += c[i];
  16. }
  17. return sum;
  18. }
  19. struct node{
  20. int x,y,z,cnt,ans;
  21. bool operator != (const node w)const{ // 重载!=符号,用来判断两个结构体信息是否相同,只判断前三个信息就够了
  22. if(x != w.x || y != w.y || z != w.z)return ;//为1代表不等
  23. else return ;
  24. }
  25. }b[maxn],a[maxn];
  26. int cmpx(node a,node b){//按x排序
  27. if(a.x != b.x)return a.x < b.x;
  28. if(a.y != b.y)return a.y < b.y;
  29. return a.z < b.z;
  30. }
  31. int cmpy(node a,node b){//按y排序
  32. if(a.y != b.y)return a.y < b.y;
  33. return a.z < b.z;
  34. }
  35. void cdq(int l,int r){
  36. if(l == r)return ;
  37. int mid = (l + r) / ;
  38. cdq(l,mid),cdq(mid+,r);
  39. sort(a + l,a + + mid,cmpy);
  40. sort(a + mid + ,a + r + ,cmpy);
  41. int i = mid + ,j = l;
  42. for(;i <= r;i++){
  43. while(a[j].y <= a[i].y && j <= mid){
  44. add(a[j].z,a[j].cnt),j++;
  45. }
  46. a[i].ans += query(a[i].z);
  47. }
  48. for(int i = l;i < j;i++)add(a[i].z,-a[i].cnt);//这一段区间处理完后对树状数组清零
  49. }
  50. int main()
  51. {
  52. cin >> n >> k;
  53. for(int i = ;i <= n;i++){
  54. cin >> b[i].x >> b[i].y >> b[i].z;
  55. }
  56. sort(b+,b++n,cmpx);
  57. int w = ,top = ;
  58. for(int i = ;i <= n;i++){
  59. w++;
  60. if(b[i] != b[i+]){
  61. a[++top] = b[i];
  62. a[top].cnt = w;
  63. w = ;
  64. }
  65. }
  66. cdq(,top);
  67. for(int i = ;i <= n;i++){//f(i)的值为a[i].ans + a[i].cnt - 1, 因为计算是去重了的
  68. cnt[a[i].ans + a[i].cnt - ] += a[i].cnt;//每个a[i] 都满足条件,加上a[i]出现的次数
  69. }
  70. for(int i= ;i < n;i++)cout << cnt[i] << endl;
  71. return ;
  72. }

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. 吴裕雄--天生自然C++语言学习笔记:C++ 多线程

    多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序.一般情况下,两种类型的多任务处理:基于进程和基于线程. 基于进程的多任务处理是程序的并发执行. 基于线程的多任务处理 ...

  2. Day3-T2

    原题目 奶牛Bessie的电脑总是无缘无故地被 FJ 关掉,奶牛 Bessie 非常苦恼,也非常生气.FJ 却发现了 一个很神奇的规律(别问是怎么知道的),发现 Bessie 每吃一次草,她的生气值会 ...

  3. 服务器搭建---Linux安装Node.js

    先去官网下载:https://nodejs.org/en/download/ 把压缩包上传到服务器的/usr/local/soft(博主习惯)文件夹下  解压文件: cd /usr/local/sof ...

  4. SFINAE 与 type_traits

    SFINAE 与 type_traits SFINAE 替换失败不是错误 (Substitution Failure Is Not An Error),此特性被用于模板元编程. 在函数模板的重载决议中 ...

  5. 七、SAP中输出当前日期

    一.在Sap中输出当前日期的函数是sy-datum,代码如下: 二.输出效果如下

  6. Relu激活函数的优点

    Relu优点: 1.可以使网络训练更快. 相比于sigmoid.tanh,导数更加好求,反向传播就是不断的更新参数的过程,因为其导数不复杂形式简单. 2.增加网络的非线性. 本身为非线性函数,加入到神 ...

  7. git修改已经push的commit message

    git中修改上一次提交的commit的message git commit --amend -m "你的新的注释" git push -f 多个commit https://www ...

  8. 标准库模块——json模块

    将Python数据类型转换为其他代码格式叫做(序列化),而json就是在各个代码实现转换的中间件. 序列化要求: 1. 只能有int,str,bool,list,dict,tuple的类型支持序列化. ...

  9. 理解Production- Ready特性

    1.外部配置(externalized configuration) 1).基于环境变量的配置 2).基于YAML的配置 3).默认配置值 2.健康检查(health checks) 1).它是否有一 ...

  10. VUE v-if与v-show

    v-if 本质:vue-if是动态的向DOM树内添加或者删除DOM元素 优点:更加灵活 <li v-for="(item, index) in scene" v-if=&qu ...