Finding Hotels

给定二维平面上nnn个点,每个点描述为x,y,cx, y, cx,y,c,x,yx, yx,y为坐标,ccc为该点的价值,

有mmm个询问,每次询问给x,y,cx, y, cx,y,c,要求,点的价值小于等于ccc的条件下,与x,yx, yx,y最近的且编号最小的点。

考虑K-D Tree,对K-D Tree的每个节点同时维护三个信息,L,R,D,U,Min_cL, R, D, U, Min\_cL,R,D,U,Min_c,然后减枝搜索即可。

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 3e5 + 10;int ls[N], rs[N], n, m;int L[N], R[N], D[N], U[N], C[N], d[N];struct Res {int x, y, c, id;
}s[N];bool cmp1(Res a, Res b) {return a.x < b.x;
}bool cmp2(Res a, Res b) {return a.y < b.y;
}void push_up(int rt) {L[rt] = R[rt] = s[rt].x;D[rt] = U[rt] = s[rt].y;C[rt] = s[rt].c;if (ls[rt]) {L[rt] = min(L[rt], L[ls[rt]]), R[rt] = max(R[rt], R[ls[rt]]);D[rt] = min(D[rt], D[ls[rt]]), U[rt] = max(U[rt], U[ls[rt]]);C[rt] = min(C[rt], C[ls[rt]]);}if (rs[rt]) {L[rt] = min(L[rt], L[rs[rt]]), R[rt] = max(R[rt], R[rs[rt]]);D[rt] = min(D[rt], D[rs[rt]]), U[rt] = max(U[rt], U[rs[rt]]);C[rt] = min(C[rt], C[rs[rt]]);}
}int build(int l, int r) {if (l > r) {return 0;}int mid = l + r >> 1;double avx = 0, avy = 0, vax = 0, vay = 0;for (int i = l; i <= r; i++) {avx += s[i].x, avy += s[i].y;}avx /= r - l + 1, avy /= r - l + 1;for (int i = l; i <= r; i++) {vax += (avx - s[i].x) * (avx - s[i].x);vay += (avy - s[i].y) * (avy - s[i].y);}if (vax > vay) {nth_element(s + l, s + mid, s + r + 1, cmp1);d[mid] = 1;}else {nth_element(s + l, s + mid, s + r + 1, cmp2);d[mid] = 2;}ls[mid] = build(l, mid - 1), rs[mid] = build(mid + 1, r);push_up(mid);return mid;
}ll ans_dis;int ans_id, ans;ll calc(int a, int b) {return 1ll * (s[a].x - s[b].x) * (s[a].x - s[b].x) + 1ll * (s[a].y - s[b].y) * (s[a].y - s[b].y);
}ll calc_min(int a, int b) {ll ans = 0;if (L[a] >= s[b].x) {ans += (L[a] - s[b].x) * (L[a] - s[b].x); }if (R[a] <= s[b].x) {ans += (s[b].x - R[a]) * (s[b].x - R[a]);}if (D[a] >= s[b].y) {ans += (D[a] - s[b].y) * (D[a] - s[b].y);}if (U[a] <= s[b].y) {ans += (s[b].y - U[a]) * (s[b].y - U[a]);}return ans;
}void query(int l, int r, int v) {if (l > r) {return ;}int mid = l + r >> 1;ll dis = calc(mid, v);if (s[mid].c <= s[v].c && (dis < ans_dis || (dis == ans_dis && s[mid].id < ans_id))) {ans_dis = dis, ans = mid, ans_id = s[mid].id;}if (l == r) {return ;}ll disl = calc_min(ls[mid], v), disr = calc_min(rs[mid], v);if (disl <= ans_dis && C[ls[mid]] <= s[v].c && disr <= ans_dis && C[rs[mid]] <= s[v].c) {if (disl < disr) {query(l, mid - 1, v);if (disr <= ans_dis) {query(mid + 1, r, v);}}else {query(mid + 1, r, v);if (disl <= ans_dis) {query(l, mid - 1, v);}}}else {if (disl <= ans_dis && C[ls[mid]] <= s[v].c) {query(l, mid - 1, v);}if (disr <= ans_dis && C[rs[mid]] <= s[v].c) {query(mid + 1, r, v);}}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int T;scanf("%d", &T);while (T--) {scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d %d %d", &s[i].x, &s[i].y, &s[i].c);s[i].id = i;}build(1, n);int n1 = n;for (int i = 1; i <= m; i++) {n1++;scanf("%d %d %d", &s[n1].x, &s[n1].y, &s[n1].c);ans_dis = 0x3f3f3f3f3f3f3f3f, ans_id = 0x3f3f3f3f;query(1, n, n1);printf("%d %d %d\n", s[ans].x, s[ans].y, s[ans].c);}}return 0;
}

Finding Hotels(牛客国庆集训派对Day7 )(2016ICPC青岛K)(K-D Tree)相关推荐

  1. 2019牛客国庆集训派对day7 A 2016(数学)

    题干: 链接:https://ac.nowcoder.com/acm/contest/1112/A 来源:牛客网 给出正整数 n 和 m,统计满足以下条件的正整数对 (a, b) 的数量: 1 < ...

  2. 牛客国庆集训派对Day7 K(2016ICPC青岛区域赛K) KDTree

    Finding Hotels 题意:对于 m m m个客人询问对于每个人离他们最近且价格在自己可承受范围内的酒店是哪一个,一共有 n n n个酒店. 题解:裸 K D T r e e KDTree K ...

  3. 2019牛客国庆集训派对day7题解

    还没补完,慢慢补,能写多少是多少··· 文章目录 2016 题目描述 思路 代码 有向无环图 题目描述 思路 代码 Parenthesis 题目描述 思路 代码 三角形和矩形 题目描述 思路 代码 2 ...

  4. 2019牛客国庆集训派对day7 A 2016

    原题 题意: 给出正整数 n 和 m,统计满足以下条件的正整数对 (a, b) 的数量: 1≤a≤n,1≤b≤m; a×b是 2016 的倍数. 思路: a*b%mod–>(a%mod * b% ...

  5. 牛客国庆集训派对Day6

    牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到1+3+5+...+2k−1=k21+3+5+...+2k-1 = k^21+3+5+.. ...

  6. 2019牛客国庆集训派对day2 K 2018(容斥)

    链接:https://ac.nowcoder.com/acm/contest/1107/K 来源:2019牛客国庆集训派对day2 题目描述   Given a, b, c, d, find out ...

  7. 2020牛客国庆集训派对day2 补题J

    2020牛客国庆集训派对day2 补题J:VIRUS OUTBREAK 题目描述 The State Veterinary Services Department recently reported ...

  8. 2020牛客国庆集训派对day3 I.Rooted Tree(哈代-拉马努金拆分数列)

    2020牛客国庆集训派对day3 I.Rooted Tree(哈代-拉马努金拆分数列) 题目 https://ac.nowcoder.com/acm/contest/7830/I 题意 给你n个点,问 ...

  9. 2020牛客国庆集训派对day2 H-STROOP EFFECT(英语题)

    2020牛客国庆集训派对day2 H-STROOP EFFECT(英语题) 题目 https://ac.nowcoder.com/acm/contest/7818/H 题意 这题目真的太难读懂了,赛后 ...

最新文章

  1. markdown怎么输入指数、幂、次方、上下标?(2^8^=256、a~0~=1)
  2. 打开方式中选择默认方式无反映_「Windows」得看,更改文件的默认应用,告别“打开方式”...
  3. 更新 绑定数据_Blazor 修仙之旅 组件与数据绑定
  4. [SpringBoot2]错误处理_默认规则
  5. Spring和JSF集成:分页
  6. 乘基取整法是什么_深入理解计算机系统(六):进制间的转换原理
  7. 计算机每个人都适合学吗,代码不等于计算机科学:为什么所有人都应该学习编程...
  8. Unity中实现列表中元素随机排序
  9. chrome浏览器关闭更新弹窗
  10. QCC3040---DFU(OTA)固件生成方法OTA方法
  11. android平板投影到电视,平板投屏到电视机如何操作可以互投
  12. Android常用的开源库收集(持续更新中)
  13. i2c-test工具说明文档
  14. fastqc检验时不能执行java_安装Fastqc软件遇到的坑
  15. YouTube营销活动方案
  16. 秘密secret的安全性以及解决哪些痛点
  17. SI5351A的信号发生器驱动程序
  18. 科技现代闪耀上海秀场 北京现代在上海车展上演转型之姿
  19. 贫民窟里的WPF系列讲座(二)
  20. 【我的Android进阶之旅】使用Retrofit进行Post请求报错: @Field parameters can only be used with form encoding.

热门文章

  1. 自定义dialog弹窗html,自定义H5页面dialog弹窗
  2. 按一行一行的方法将一个文本文件复制到另一个文件中_命令行技巧:分割文件内容...
  3. WiFi密码都不会破译​还想考清华?​
  4. 这个被称为20世纪最伟大人物的最强理科生,到底有多强,你根本不了解
  5. 有趣的灵魂,从高质量的阅读开始
  6. 小米3g刷高格固件_小米路由器3G刷了老毛子之后恢复官方固件
  7. python join_python join 和 split的常用使用方法
  8. 联想电脑如何添加无线网络连接服务器,安装英特尔MYWIFI的操作步骤
  9. 计算机常用编程英语词汇大全,计算机编程及常用术语英语词汇大全
  10. python功能函数_Python-功能函数的使用