【CDQ分治】三维偏序(luogu 3801/金牌导航 CDQ分治-1)

2024-01-29 23:38

本文主要是介绍【CDQ分治】三维偏序(luogu 3801/金牌导航 CDQ分治-1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三维偏序

luogu 3801

金牌导航 CDQ分治-1

题目大意

有n个元素,第i个元素有 a i , b i , c i a_i,b_i,c_i ai,bi,ci三个属性,设 f(i)表示满足 a j ⩽ a i a_j\leqslant a_i ajai b j ⩽ b i b_j \leqslant b_i bjbi c j ⩽ c i c_j \leqslant c_i cjci j ≠ i j \ne i j=i的j的数量
对于 d ∈ [ 0 , n ) d \in [0, n) d[0,n),求 f(i) = d的数量

样例输入

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 ⩽ N ⩽ 1 0 5 , 1 ⩽ a i , b i , c i ⩽ k ⩽ 2 × 1 0 5 1\leqslant N\leqslant 10^5,1\leqslant a_i,b_i,c_i\leqslant k\leqslant 2\times10^5 1N105,1ai,bi,cik2×105

解题思路

先对第一维进行排序然后在分治的同时归并排序,并求出左子树中b值比右子树大的,对于第三维,用树状数组计算即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
using namespace std;
int n, k, g, c[N<<1], ans[N];
struct node
{int a, b, c, v, s;
}a[N], b[N];
bool cmpp(node a, node b)
{return a.b < b.b;
}
bool cmp(node a, node b)
{return a.a < b.a || a.a == b.a && a.b < b.b || a.a == b.a && a.b == b.b && a.c < b.c;
}
void add(int x, int y)
{for (; x <= k; x += x & -x)c[x] += y;
}
int ask(int x)
{int sum = 0;for (; x; x -= x & -x)sum += c[x];return sum;
}
void solve(int l, int r)
{if (l == r) return;int mid = l + r >> 1, h1 = l, h2 = mid + 1, h = l;solve(l, mid);//分治solve(mid + 1, r);while(h1 <= mid && h2 <= r)//归并排序,同时用树状数组求答案{if (a[h1].b <= a[h2].b){add(a[h1].c, a[h1].s);b[h++] = a[h1++];}else{a[h2].v += ask(a[h2].c);b[h++] = a[h2++];}}while(h1 <= mid){add(a[h1].c, a[h1].s);b[h++] = a[h1++];}while(h2 <= r){a[h2].v += ask(a[h2].c);b[h++] = a[h2++];}for (int i = l; i <= mid; ++i)add(a[i].c, -a[i].s);for (int i = l; i <= r; ++i)a[i] = b[i];
}
int main()
{scanf("%d%d", &n, &k);for (int i = 1; i <= n; ++i)scanf("%d%d%d", &a[i].a, &a[i].b, &a[i].c);sort(a + 1, a + 1 + n, cmp);a[g = 1].s++;for (int i = 2; i <= n; ++i)if (a[g].a == a[i].a && a[g].b == a[i].b && a[g].c == a[i].c) a[g].s++;//离散化else a[++g] = a[i], a[g].s++;solve(1, g);for (int i = 1; i <= g; ++i)ans[a[i].v + a[i].s - 1] += a[i].s;//还要加上相等但不是同一个点的值for (int i = 0; i < n; ++i)printf("%d\n", ans[i]);return 0;
}

这篇关于【CDQ分治】三维偏序(luogu 3801/金牌导航 CDQ分治-1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658526

相关文章

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

Rhinoceros 8 for Mac/Win:重塑三维建模边界的革新之作

Rhinoceros 8(简称Rhino 8),作为一款由Robert McNeel & Assoc公司开发的顶尖三维建模软件,无论是对于Mac还是Windows用户而言,都是一款不可多得的高效工具。Rhino 8以其强大的功能、广泛的应用领域以及卓越的性能,在建筑设计、工业设计、产品设计、三维动画制作、科学研究及机械设计等多个领域展现出了非凡的实力。 强大的建模能力 Rhino 8支持多种建

数据集 Ubody人体smplx三维建模mesh-姿态估计 >> DataBall

Ubody开源人体三维源数据集-smplx-三维建模-姿态估计 UBody:一个连接全身网格恢复和真实生活场景的上半身数据集,旨在拟合全身网格恢复任务与现实场景之间的差距。 UBody包含来自多人的现实场景的1051k张高质量图像,这些图像拥有2D全身关键点、3D SMPLX模型。 UBody由国际数字经济学院(IDEA)提供。 (UBody was used for mesh r

三维布尔运算对不规范几何数据的兼容处理

1.前言 上一篇文章谈过八叉树布尔运算,对于规范几何数据的情况是没有问题的。 在实际情况中,由于几何数据来源不一,处理和生成方式不一,我们无法保证进行布尔运算的几何数据都是规范的,对于不规范情况有时候也有需求,这就需要兼容不规范数据情况,当然这种兼容不是一味的让步,而是对于存在有限的不规范数据的兼容处理。 2.原始数据示例 下图是一个大坝模型和之上要对其进行布尔运算的立方体。 大坝模型由

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘: