P3810 【模板】三维偏序(陌上花开)(CDQ分治)
题目背景
这是一道模板题
可以使用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 的数量。
输入输出样例
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
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分治)的更多相关文章
- BZOJ3262: 陌上花开(三维偏序,CDQ分治)
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...
- 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 ...
- hdu5618 (三维偏序,cdq分治)
给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...
- P3810 陌上花开 CDQ分治
陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...
- 洛谷P3810 陌上花开 CDQ分治(三维偏序)
好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...
- BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1439 Solved: 648[Submit][Status][Discuss ...
- N维偏序:cdq分治
cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...
- bzoj3262陌上花开 cdq分治
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2794 Solved: 1250[Submit][Status][Discus ...
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
随机推荐
- servlet中urlpatterns注意事项
在servlet中, @WebServlet(urlPatterns="/newsAdd")接收 resp.sendRedirect("/wedding/houtai/N ...
- 002、将mysql用作一个简单的计算器
SELECT PI( ), , ( ) ; 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.
- Promise 与 await 组合使用
看例子就行了,废话不多说! async function checkStatus(name){ return new Promise((resolve,reject) => { ...
- UVALive 4487 Exclusive-OR 加权并查集神题
已知有 x[0-(n-1)],但是不知道具体的值,题目给定的信息 只有 I P V,说明 Xp=V,或者 I P Q V,说明 Xp ^ Xq=v,然后要求回答每个询问,询问的是 某任意的序列值 Xp ...
- mariadb主从
实验环境: 两台centos7 master:192.168.1.6 slave:192.168.1.7 一.安装mariadb服务 [root@master ~]# yum -y install m ...
- centos 7.4 磁盘空间不足,扩容根分区 --lvm模式
背景:根分区磁盘空间不足,需要扩容root磁盘空间 1.查看现有磁盘信息,可以看出根分区有26G [root@localhost ~]# df -h 2.查看新增加的磁盘信息(改虚拟机已经添加好了,不 ...
- spring boot 异常(exception)处理
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- JS事件-对象监视事件,事件触发函数
写在前面: 一句话作为本文的核心思想:对象监视事件,事件触发函数: (一)事件 1.事件分类 (1)鼠标事件 click() 鼠标单击 dblclick() ...
- VUE注册全局组件和局部组件
全局组件 第一步:在components文件夹下建立一个子文件Users.vue <template> <div class="users"> {{msg} ...
- Tomcat跨域
先下载 cors-filter-2.6.jar 2.java-property-utils-1.9.1.jar,这两个文件有些在csdn上积分太高,有些要百度网盘,还要下载百度网盘客户端,太麻烦,直 ...