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]相关推荐

  1. HDU - 6183 暴力,线段树动态开点,cdq分治

    B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...

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

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

  3. HDU 6135 Casual Podracing(CDQ分治)

    Description 一个周长为 L L的圆弧上面有nn个不重合的点,第 i i个点距圆弧起点距离(圆上距离)为did_i,速度为 vi v_i(取逆时针为正方向,任意两点速度不同),能量为 wi ...

  4. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

  5. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  6. 洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)

    题目链接:点击查看 题目大意:给出一个二维平面坐标系,需要执行数次操作,具体操作分为下列两种: 1 x y a:坐标 (x,y)(x,y)(x,y) 加上 aaa 个点 2 x1 y1 x2 y2:查 ...

  7. CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点,没有边. 依次加入mmm条带权的边,每次加入后询问是否存在一个边集,满足每 ...

  8. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  9. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

最新文章

  1. 华人博士生首次尝试用两个Transformer构建一个GAN
  2. 我十年学习编程的历史
  3. 什么?ES6 中还有 Tail Calls!
  4. 三极管的经典模型——两个二极管连接和三极管人(transistor man)
  5. 190325每日一句
  6. javaweb课程设计之XXX管理系统
  7. MarkDown的下载、安装和基础使用
  8. 集成学习-Stacking与Blending与泰坦尼克号特征工程(DataWhale第二期)
  9. 进行分词时,报错omw-1.4安装包未找到?
  10. 三星Galaxy S20:将侧面按钮更改为电源按钮
  11. macOS10.14虚拟机无法登录Apple ID终极解决方法
  12. liunx服务器项目迁移,linux服务器数据迁移
  13. Matlab论文插图绘制模板第70期—带误差棒的柱状图(Bar with Errorbar)
  14. RabbitVCS:ubuntu下svn可视化工具的安装和使用
  15. jfreechart开发体温单
  16. 大学网络安全主题班会PPT模板
  17. 2020华电发电厂期末考试真题(火电厂,热工控制系统 发电厂建模控制与仿真)
  18. SIM800c收发短信及AT指令
  19. vue项目中使用高德地图行政区域聚合功能(script引入方式)
  20. H5中的明星互动,变为另一种品牌推广营销方式

热门文章

  1. c++ 或者 vc++中判断程序实例是否运行
  2. 九阴真经 第二层 第9天
  3. 2017软件工程第三次作业--效能分析
  4. linux下安装 配置 redis数据库
  5. 【自然框架之SSO】实现SSO的一个初步想法
  6. 为CodeLove编写插件——常用软件扫描(SoftwareToScan)
  7. mongodb之索引学习
  8. 大数据热门职业薪酬榜 Hadoop人才居首
  9. 【BZOJ】3779 重组病毒
  10. 第二章作业第2题--苏志华