Luogu3810 三维偏序(陌上花开)
原题链接: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 三维偏序(陌上花开)相关推荐
- 题解 三维偏序(陌上花开)+黑科技食用
Sol 前言 在看题目之前,先给大家安利一个好博客,博主就是用过这篇博客和巨佬YCB的帮助下学会的 想学会CDQ就戳我 题目大意 有nnn个元素,第i" role="present ...
- 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 ...
- P3810 【模板】三维偏序(陌上花开)
P3810 [模板]三维偏序(陌上花开) cdq分治的模板题目,用cdq分治处理点对的问题,首先按照第一维排序,然后分治,这样就可以每次考虑二三维即可,然后就可以利用树状数组求解了,然后一个核心的代码 ...
- 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)
题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...
- CDQ解决一些三维偏序的问题
本来几天前就该记录的东西,硬生生被我拖到了现在,太懒了... 在cdq学习时,二维偏序已经解决了,无非就是先sort使第一维有序,然后再用cdq或者数据结构处理第二维.而三维偏序的时候呢,大佬的做法好 ...
- 分治算法,逆序对,三维偏序与CDQ分治
分治算法基本思想 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出. 对于这类问题,我们往往先把它分解成几个子问题,找到求出 ...
- CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)
题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...
- HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)
题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...
- CodeForces - 160E Buses and People(线段树+三维偏序)
题目链接:点击查看 题目大意:(网上复制一下别人的题意..懒) 有n辆公交车,每辆公交车有s(起始点),f(终点),t(发车时间) (行驶不需要时间) 有m个人,每个人有l(起点),r(终点),t(出 ...
- P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)
题目描述 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户C的位置在哪?"的问题,精确到毫米.但其真正高科 ...
最新文章
- mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的
- HDU 5676 ztr loves lucky numbers
- 重磅开源!推荐一个以最优惠的方式购买极客时间课程的开源项目!
- 一起看一下主流应用使用了哪些三方库
- 对未来人机融合智能领域的思考
- 马希荣计算机应用,天津师范大学硕士研究生导师:马希荣
- MongoDB shell
- 物联网技术或颠覆传统高等教育
- c语言mpi矩阵乘法,【MPI并行程序】矩阵乘法
- Android系统的若干关键词大汇总
- 微型计算机强化训练的答案,微型计算机第8章+强化训练
- android 8.0获取通知权限,Android8.0通知权限适配
- WinPE系统对硬盘分区
- 对populate()方法的理解
- 第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解
- 课题组亓林博士的论文被 IEEE TGRS 录用
- 复杂的1秒 图解Google搜索技术
- Linux进程的创建
- Qt与设计模式(全)
- go实践二十 web开发--表单唯一token 表单验证 防止xss攻击 上传文件 cookie处理
热门文章
- As-If-Serial 理解
- 【日常学习】【二叉树遍历】Uva548 - Tree题解
- (二). 细说Kalman滤波:The Kalman Filter
- c# 小写金额转大写
- [ZT]用CSC.exe来编译Visual C#的代码文件,解释CSC参数和开关的具体作用
- matlab运行没有图片,simulink模型运行时没报错,但scope没有图像,什么原因?
- SpringCloud常见面试题总结二
- RabbitMQ消息幂等性之全局唯一ID
- ReentrantLock源码解读
- 多线程之线程池Executor应用