CDQ分治 Jam's problem again [HDU - 5618]
A - Jam's problem again HDU - 5618
Problem Description
Jam like to solve the problem which on the 3D-axis,given N(1≤N≤100000) points (x,y,z)(1≤x,y,z≤100000)
If two point such as$ (x_i,y_i,z_i)$ and \((x_j,y_j,z_j)\) \(x_i≥x_j,y_i≥_j,z_i≥z_j\), the bigger one level add 1
Ask for the each level of the point.
Input
The first line is T(1≤T≤15) means T Case
For each case
The first line is N means the number of Point and next there are N line, each line has (x,y,z)
Output
Output with N line,each line has one number means the lever of point
Sample Input
1
4
10 4 7
10 6 6
8 2 5
7 3 10
Sample Output
1
1
0
0
题解
三维偏序
初始按\(x\)为意义关键字,\(y\)为第二关键字,\(z\)为第三关键字排序,一定不能省只按\(x\)排序,因为要处理相同的点
分别处理子问题,然后以\(y\)坐标为关键字, 将左右两端归并排序(这样递归左右内部\(y\)有序)
并用树状数组维护前缀的\(z\)的信息(当前左边的\(x\)一定比右边小,并且\(y\)也有序)
归并到左边的点就插入\(z\), 右边的点询问\(z\)
对于相同的点,我们初始发现排完序后,相同的点中序号较前的点不会统计到后面相同的点,只有最后的那个点才统计完全
所以可以在一开始先将相同的点加上\(p, p-1, ..., 1, 0\)就好了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>using namespace std;typedef long long LL;
const int MAXN = 1e5 + 10;inline LL in()
{LL x = 0, flag = 1; char ch = getchar();while (ch < '0' || ch > '9') { if (ch == '-') flag = -1; ch = getchar(); }while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();return x * flag;
}int T;int n;struct Fenwick
{int val[MAXN];void clear() { memset(val, 0, sizeof val); }void update(int x, int v){for (int i = x; i <= 100000; i += i & (-i)) val[i] += v;}int query(int x){int ret = 0;for (int i = x; i > 0; i &= (i - 1)) ret += val[i];return ret;}
} FT;int an[MAXN];
struct Node
{int x, y, z, id;bool operator < (const Node & b) const{return x == b.x ? (y == b.y ? z < b.z : y < b.y) : x < b.x; }
} a[MAXN], b[MAXN];void merge(int l, int mid, int r)
{int i = l, j = mid + 1, k = i;while (k <= r){if (j > r || (i <= mid && a[i].y <= a[j].y)){FT.update(a[i].z, 1);b[k ++] = a[i];++ i;}else{an[a[j].id] += FT.query(a[j].z);b[k ++] = a[j];++ j;}}for (int i = l; i <= mid; i ++) FT.update(a[i].z, -1);for (int i = l; i <= r; i ++) a[i] = b[i];
}
void solve(int l, int r)
{if (l >= r) return;int mid = (l + r) >> 1;solve(l, mid);solve(mid + 1, r);merge(l, mid, r);
}int main()
{T = in();while (T --){memset(a, 0, sizeof a);memset(an, 0, sizeof an);n = in(); for (int i = 1; i <= n; i ++) a[i] = (Node) { in(), in(), in(), i };sort(a + 1, a + n + 1);for (int i = n - 1; i >= 1; i --){if (a[i].x == a[i + 1].x && a[i].y == a[i + 1].y && a[i].z == a[i + 1].z) an[a[i].id] += an[a[i + 1].id] + 1;}solve(1, n);for (int i = 1; i <= n; i ++) printf("%d\n", an[i]);}return 0;
}/**/
转载于:https://www.cnblogs.com/ikihsiguoyr/p/10569484.html
CDQ分治 Jam's problem again [HDU - 5618]相关推荐
- HDU - 6183 暴力,线段树动态开点,cdq分治
B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...
- HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)
题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...
- HDU 6135 Casual Podracing(CDQ分治)
Description 一个周长为 L L的圆弧上面有nn个不重合的点,第 i i个点距圆弧起点距离(圆上距离)为did_i,速度为 vi v_i(取逆时针为正方向,任意两点速度不同),能量为 wi ...
- 【BZOJ-3456】城市规划 CDQ分治 + NTT
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- 洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)
题目链接:点击查看 题目大意:给出一个二维平面坐标系,需要执行数次操作,具体操作分为下列两种: 1 x y a:坐标 (x,y)(x,y)(x,y) 加上 aaa 个点 2 x1 y1 x2 y2:查 ...
- CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】
正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点,没有边. 依次加入mmm条带权的边,每次加入后询问是否存在一个边集,满足每 ...
- P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...
- BZOJ2683 简单题(CDQ分治)
传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...
最新文章
- 华人博士生首次尝试用两个Transformer构建一个GAN
- 我十年学习编程的历史
- 什么?ES6 中还有 Tail Calls!
- 三极管的经典模型——两个二极管连接和三极管人(transistor man)
- 190325每日一句
- javaweb课程设计之XXX管理系统
- MarkDown的下载、安装和基础使用
- 集成学习-Stacking与Blending与泰坦尼克号特征工程(DataWhale第二期)
- 进行分词时,报错omw-1.4安装包未找到?
- 三星Galaxy S20:将侧面按钮更改为电源按钮
- macOS10.14虚拟机无法登录Apple ID终极解决方法
- liunx服务器项目迁移,linux服务器数据迁移
- Matlab论文插图绘制模板第70期—带误差棒的柱状图(Bar with Errorbar)
- RabbitVCS:ubuntu下svn可视化工具的安装和使用
- jfreechart开发体温单
- 大学网络安全主题班会PPT模板
- 2020华电发电厂期末考试真题(火电厂,热工控制系统 发电厂建模控制与仿真)
- SIM800c收发短信及AT指令
- vue项目中使用高德地图行政区域聚合功能(script引入方式)
- H5中的明星互动,变为另一种品牌推广营销方式