原题链接:https://www.luogu.org/problemnew/show/P3810

【模板】三维偏序(陌上花开)

题目背景

这是一道模板题

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

题目描述

有 nnn 个元素,第i" role="presentation" style="position: relative;">ii i 个元素有aiai a_i、bibi b_i 、cici c_i三个属性,设f(i)f(i) f(i) 表示满足aj≤aiaj≤ai a_j \leq a_i 且bj≤bibj≤bi b_j \leq b_i 且 cj≤cicj≤cic_j \leq c_i 的 jjj 的数量。

对于 d∈[0,n)" role="presentation" style="position: relative;">d∈[0,n)d∈[0,n)d \in [0, n) ,求f(i)=df(i)=d f(i) = d 的数量

输入输出格式
输入格式:

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

之后n" role="presentation" style="position: relative;">nn n行,每行三个整数aiai a_i 、bibi b_i 、cici c_i,分别表示三个属性值。

输出格式:

输出 nnn行,第d+1" role="presentation" style="position: relative;">d+1d+1 d + 1行表示f(i)=df(i)=d f(i) = d 的 iii 的数量。

输入输出样例
输入样例#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≤n≤100000,1≤k≤200000" role="presentation" style="position: relative;">1≤n≤100000,1≤k≤2000001≤n≤100000,1≤k≤2000001 \leq n \leq 100000, 1 \leq k \leq 200000

题解

考虑使用cdqcdqcdq分治,第一维直接排序搞掉,第二维cdqcdqcdq搞成离线,最后一位上数据结构即可。

左半边对右半边的贡献很好统计,左边为单点加,右边为区间求和。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=1e6+5;
struct sd{int p,q,r,sum,cot,id;};
bool cmp1(sd a,sd b)
{if(a.p!=b.p)return a.p<b.p;if(a.q!=b.q)return a.q<b.q;return a.r<b.r;
}
bool cmp2(sd a,sd b){return a.q==b.q?(a.r==b.r?a.p<b.p:a.r<b.r):a.q<b.q;}
bool operator !=(sd a,sd b){return a.p!=b.p||a.q!=b.q||a.r!=b.r;}
int sum[M],ans[M],n,tot,base=1;
sd x[M],que[M];
void in()
{int a;scanf("%d%d",&n,&a);while(base<a)base<<=1;for(int i=1;i<=n;++i)scanf("%d%d%d",&x[i].p,&x[i].q,&x[i].r);
}
void add(int v,int s){v+=base;for(;v;v>>=1)sum[v]+=s;}
int query(int le,int ri)
{int ans=0;le+=base;ri+=base;for(;le^ri^1;le>>=1,ri>>=1){if(le&1^1)ans+=sum[le+1];if(ri&1)ans+=sum[ri-1];}return ans;
}
void cdq(int le,int ri)
{if(le==ri)return;int mid=(le+ri)>>1;cdq(le,mid);cdq(mid+1,ri);sort(que+le,que+ri+1,cmp2);for(int i=le;i<=ri;++i){if(que[i].id<=mid)add(que[i].r,que[i].cot);else que[i].sum+=query(0,que[i].r+1);}for(int i=le;i<=ri;++i)if(que[i].id<=mid)add(que[i].r,-que[i].cot);
}
void ac()
{sort(x+1,x+1+n,cmp1);for(int i=1;i<=n;++i){if(x[i]!=x[i-1])que[++tot]=x[i],que[tot].id=tot;++que[tot].cot;}cdq(1,tot);for(int i=1;i<=tot;++i)ans[que[i].sum+que[i].cot-1]+=que[i].cot;for(int i=0;i<n;++i)printf("%d\n",ans[i]);
}
int main()
{in();ac();return 0;
}

Luogu3810 三维偏序(陌上花开)相关推荐

  1. 题解 三维偏序(陌上花开)+黑科技食用

    Sol 前言 在看题目之前,先给大家安利一个好博客,博主就是用过这篇博客和巨佬YCB的帮助下学会的 想学会CDQ就戳我 题目大意 有nnn个元素,第i" role="present ...

  2. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

  3. P3810 【模板】三维偏序(陌上花开)

    P3810 [模板]三维偏序(陌上花开) cdq分治的模板题目,用cdq分治处理点对的问题,首先按照第一维排序,然后分治,这样就可以每次考虑二三维即可,然后就可以利用树状数组求解了,然后一个核心的代码 ...

  4. 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)

    题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...

  5. CDQ解决一些三维偏序的问题

    本来几天前就该记录的东西,硬生生被我拖到了现在,太懒了... 在cdq学习时,二维偏序已经解决了,无非就是先sort使第一维有序,然后再用cdq或者数据结构处理第二维.而三维偏序的时候呢,大佬的做法好 ...

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

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

  7. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  8. HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)

    题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...

  9. CodeForces - 160E Buses and People(线段树+三维偏序)

    题目链接:点击查看 题目大意:(网上复制一下别人的题意..懒) 有n辆公交车,每辆公交车有s(起始点),f(终点),t(发车时间) (行驶不需要时间) 有m个人,每个人有l(起点),r(终点),t(出 ...

  10. P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)

    题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...

最新文章

  1. mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的
  2. HDU 5676 ztr loves lucky numbers
  3. 重磅开源!推荐一个以最优惠的方式购买极客时间课程的开源项目!
  4. 一起看一下主流应用使用了哪些三方库
  5. 对未来人机融合智能领域的思考
  6. 马希荣计算机应用,天津师范大学硕士研究生导师:马希荣
  7. MongoDB shell
  8. 物联网技术或颠覆传统高等教育
  9. c语言mpi矩阵乘法,【MPI并行程序】矩阵乘法
  10. Android系统的若干关键词大汇总
  11. 微型计算机强化训练的答案,微型计算机第8章+强化训练
  12. android 8.0获取通知权限,Android8.0通知权限适配
  13. WinPE系统对硬盘分区
  14. 对populate()方法的理解
  15. 第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解
  16. 课题组亓林博士的论文被 IEEE TGRS 录用
  17. 复杂的1秒 图解Google搜索技术
  18. Linux进程的创建
  19. Qt与设计模式(全)
  20. go实践二十 web开发--表单唯一token 表单验证 防止xss攻击 上传文件 cookie处理

热门文章

  1. As-If-Serial 理解
  2. 【日常学习】【二叉树遍历】Uva548 - Tree题解
  3. (二). 细说Kalman滤波:The Kalman Filter
  4. c# 小写金额转大写
  5. [ZT]用CSC.exe来编译Visual C#的代码文件,解释CSC参数和开关的具体作用
  6. matlab运行没有图片,simulink模型运行时没报错,但scope没有图像,什么原因?
  7. SpringCloud常见面试题总结二
  8. RabbitMQ消息幂等性之全局唯一ID
  9. ReentrantLock源码解读
  10. 多线程之线程池Executor应用