The Closest M Points BZOJ 3053

The Closest M Points

【问题描述】

软工学院的课程很讨厌!ZLC同志遇到了一个头疼的问题:在K维空间里面有许多的点,对于某些给定的点,ZLC需要找到和它最近的m个点。

(这里的距离指的是欧几里得距离:D(p, q) = D(q, p) =  sqrt((q1 - p1) ^ 2 + (q2 - p2) ^ 2 + (q3 - p3) ^ 2 + ... + (qn - pn) ^ 2)

ZLC要去打Dota,所以就麻烦你帮忙解决一下了……

【输入格式】

第一行,两个非负整数:点数n(1 <= n <= 50000),和维度数k(1 <= k <= 5)。

接下来的n行,每行k个整数,代表一个点的坐标。

接下来一个正整数:给定的询问数量t(1 <= t <= 10000)

下面2*t行:

  第一行,k个整数:给定点的坐标

  第二行:查询最近的m个点(1 <= m <= 10)

所有坐标的绝对值不超过10000。

有多组数据!

【输出格式】

对于每个询问,输出m+1行:

第一行:"the closest m points are:" m为查询中的m

接下来m行每行代表一个点,按照从近到远排序。

保证方案唯一,下面这种情况不会出现:

2 2

1 1

3 3

1

2 2

1

【样例输入】

3 2

1 1

1 3

3 4

2

2 3

2

2 3

1

【样例输出】

5

0

4

 


题解:

题意就是求与给定点第一近到第m近的点

用KD树查询

期望答案的计算:与给定点最近且不与给定点在同一块的期望点必定在边界上

开始时先将m个inf加入

那么当查询到的点与给定点的距离小于堆顶与给定点的距离时,就去掉堆顶并加入这个点

最后倒序输出

注意初始化(虽然没写什么初始化,但是要考虑一下的)

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cstdlib>
  5 #include<cstdio>
  6 #include<cmath>
  7 #include<queue>
  8 using namespace std;
  9 inline void Scan(int &x)
 10 {
 11     int o = 1;
 12     char c;
 13     while((c = getchar()) < '0' || c > '9')
 14         if(c == '-') o = -1;
 15     x = c - '0';
 16     while((c = getchar()) >= '0' && c <= '9') x = x * 10 + c - '0';
 17     x *= o;
 18 }
 19 const int me = 50233;
 20 const int inf = 2147483647;
 21 struct dot
 22 {
 23     int lc, rc;
 24     int dis;
 25     int v[6], mi[6], ma[6];
 26 };
 27 dot point;
 28 dot c[me];
 29 dot tr[me];
 30 dot ans[me];
 31 struct name
 32 {
 33     int x;
 34     int dis;
 35 };
 36 inline bool operator < (const name &a, const name &b)
 37 {
 38     return a.dis < b.dis;
 39 }
 40 priority_queue <name> sta;
 41 int e, n, k, m;
 42 inline bool cmp(const dot &a, const dot &b)
 43 {
 44     return a.v[e] < b.v[e];
 45 }
 46 inline int Min(const int &x, const int &y)
 47 {
 48     return (x < y) ? x : y;
 49 }
 50 inline int Max(const int &x, const int &y)
 51 {
 52     return (x > y) ? x : y;
 53 }
 54 inline int Sqr(const int &x)
 55 {
 56     return x * x;
 57 }
 58 inline void Update(const int &x)
 59 {
 60     int l = tr[x].lc, r = tr[x].rc;
 61     for(int i = 0; i < k; ++i)
 62     {
 63         tr[x].mi[i] = tr[x].ma[i] = tr[x].v[i];
 64         if(l) tr[x].mi[i] = Min(tr[x].mi[i], tr[l].mi[i]), tr[x].ma[i] = Max(tr[x].ma[i], tr[l].ma[i]);
 65         if(r) tr[x].mi[i] = Min(tr[x].mi[i], tr[r].mi[i]), tr[x].ma[i] = Max(tr[x].ma[i], tr[r].ma[i]);
 66     }
 67 }
 68 int Build(const int &l, const int &r, int d)
 69 {
 70     if(d >= k) d -= k;
 71     e = d;
 72     int mi = l + r >> 1;
 73     nth_element(c + l, c + mi, c + r + 1, cmp);
 74     tr[mi] = c[mi];
 75     if(l < mi) tr[mi].lc = Build(l, mi - 1, d + 1);
 76     if(r > mi) tr[mi].rc = Build(mi + 1, r, d + 1);
 77     Update(mi);
 78     return mi;
 79 }
 80 inline int Dis(const int &x)
 81 {
 82     int sum = 0;
 83     for(int i = 0; i < k; ++i)
 84         sum += Sqr(tr[x].v[i] - point.v[i]);
 85     return sum;
 86 }
 87 inline int Get(const int &x)
 88 {
 89     int sum = 0;
 90     for(int i = 0; i < k; ++i)
 91     {
 92         if(point.v[i] < tr[x].mi[i]) sum += Sqr(tr[x].mi[i] - point.v[i]);
 93         if(point.v[i] > tr[x].ma[i]) sum += Sqr(point.v[i] - tr[x].ma[i]);
 94     }
 95     return sum;
 96 }
 97 void Ask(const int &x)
 98 {
 99     int dis = Dis(x);
100     if(dis < sta.top().dis)
101     {
102         sta.pop();
103         sta.push((name) {x, dis});
104     }
105     int le = inf, ri = inf;
106     if(tr[x].lc) le = Get(tr[x].lc);
107     if(tr[x].rc) ri = Get(tr[x].rc);
108     if(le < ri)
109     {
110         if(le < sta.top().dis) Ask(tr[x].lc);
111         if(ri < sta.top().dis) Ask(tr[x].rc);
112     }
113     else
114     {
115         if(ri < sta.top().dis) Ask(tr[x].rc);
116         if(le < sta.top().dis) Ask(tr[x].lc);
117     }
118 }
119 int main()
120 {
121 //    freopen("d.in", "r", stdin), freopen("d.out", "w", stdout);
122     while(~scanf("%d", &n))
123     {
124         Scan(k);
125         for(int i = 1; i <= n; ++i)
126             for(int j = 0; j < k; ++j)
127                 Scan(c[i].v[j]);
128         int root = Build(1, n, 0);
129         int t;
130         Scan(t);
131         while(t--)
132         {
133             for(int i = 0; i < k; ++i) Scan(point.v[i]);
134             Scan(m);
135             for(int i = 1; i <= m; ++i) sta.push((name) {0, inf});
136             Ask(root);
137             for(int i = 1; i <= m; ++i)
138             {
139                 ans[i] = tr[sta.top().x];
140                 sta.pop();
141             }
142             printf("the closest %d points are:\n", m);
143             for(int i = m; i >= 1; --i)
144             {
145                 for(int j = 0; j < k - 1; ++j)
146                     printf("%d ", ans[i].v[j]);
147                 printf("%d\n", ans[i].v[k - 1]);
148             }
149         }
150     }
151 }

转载于:https://www.cnblogs.com/lytccc/p/6442180.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs2012 官方下载地址

http://download.microsoft.com/download/B/0/F/B0F589ED-F1B7-478C-849A-02C8395D0995/VS2012_ULT_chs.iso

php ci post 请求,CI框架中判断post,ajax,get请求的方法

这篇文章主要介绍了关于CI框架中判断post,ajax,get请求的方法 &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下CI框架当中并没有提供&#xff0c;类似tp框架中IS_POST,IS_AJAX,IS_GET的方法。所有就得我们自己造轮子了。下面就…

InstallShield 常用常量

BATCH_INSTALL 指示当传输文件采用LOCKEDFILE或SHAREDFILE时是否锁定文件CMDLINE Setup.exe传递的命令行参数COMMONFILES Common files全路径如“c:\program file\common files”ERRORFILENAMEFOLDER_DESKTOP Windows桌面folder的路径FOLDER_PROGRAMS Windows开始菜单中 开始\程…

[position]返回顶部

position:fixed;实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>返回顶部</title> </head> <body style"margin: 0"> <div style"width: 50px;height: 50px…

InstallShield SdShowMsg未关闭导致安装程序无法停止

strMsg"hehe";SdShowMsg(strMsg,true);//显示消息 ……SdShowMsg(strMsg,false);//关闭消息SdShowMsg后要关闭窗口&#xff0c;否则安装程序会一直运行&#xff0c;点击完成之后也会在任务栏里。

php 自定义行间距,phpstorm 常见设置

0.转载于 http://www.cnblogs.com/dc10101/archive/2013/01/03/2842590.html1.关于字体颜色 亮度 调整内容如下&#xff1a;ctrlalts打开Settings界面&#xff0c;Editor > Colors&Fonts > Font。Default scheme是亮色调&#xff0c;但我想定制一套暗背景的环境&…

POJ1430 Binary Stirling Numbers

(POJ)[Stirling數, 排列組合, 數形結合] Description The Stirling number of the second kind S(n, m) stands for the number of ways to partition a set of n things into m nonempty subsets. For example, there are seven ways to split a four-element set into two pa…

F#文本类型

类型 说明 后缀或前缀 示例 sbyte 有符号 8 位整数 y 86y 0b00000101y byte 无符号 8 位自然数 uy 86uy 0b00000101uy int16 有符号 16 位整数 s 86s uint16 无符号 16 位自然数 us 86us int int32 有符号 32 位整数 l none。 86 86l uint uint32 无符号 32 位自然数 u 或 ul 8…

mysql约束教程,MySQL 约束

本章我们将介绍约束&#xff0c;约束放在列或表上。 它们限制了可以插入表中的数据。我们有以下限制&#xff1a;非空唯一主键外键枚举SET其他数据库也具有 CHECK 约束&#xff0c;该约束为有效数据设置了条件。 MySQL 解析了这个约束&#xff0c;但是没有强制执行。非空约束具…

ASP调用.Net dll

SET xobj Server.CreateObject("Test.Analyzer") b xobj.Do(a).net 开发Test.dll&#xff0c;要有强名称签名&#xff0c;COM可见要打开。执行以下命令gacutil /U Testregasm Test.dll /uregasm Test.dll /tlb Test.tlb gacutil /I Test.dll

php 页面加载进度条,HTML5/CSS3 网页加载进度条的实现,下载进度条等经典案例

今天给大家带来一个比较炫的进度条&#xff0c;进度条在一耗时操作上给用户一个比较好的体验&#xff0c;不会让用户觉得在盲目等待&#xff0c;对于没有进度条的长时间等待&#xff0c;用户会任务死机了&#xff0c;毫不犹豫的关掉应用&#xff1b;一般用于下载任务&#xff0…

.Net 强名称签名程序集

项目——属性——签名——选中为程序集签名——选择强名称密钥文件——新建 重新编译即可多用于作为COM组件与其他程序交互强名称签名的程序集如果被篡改&#xff0c;那么CLR在加载该程序集进行完整性验证的时候就会失败。但是强名称可以通过其他工具去除。

观后感

看过视频之后&#xff0c;我个人有以下几点观后感&#xff1a; 1、刻意练习&#xff0c;刻意就是持续地做你不会做的事&#xff1b; 2、针对性的重复练习&#xff0c;学习是没有捷径的&#xff1b; 3、不断地挑战意外&#xff0c;不让自己处于“失控”状态&#xff1b; 4、让自…

java web项目中连接mysql数据库,javaweb之eclipse工程连接mysql数据库

javaweb之eclipse工程连接mysql数据库准备工作&#xff1a;1.在mysql官网下载mysqlconnection的jar包输入网址&#xff1a;mysql.com—点击DOWNLOADS——下拉选择MySQL Community (GPL) Downloads ——选择Connector/J——下载后解压——找到mysql-connector-java-8.0.22.jar2.…

Win7的市场份额终于超过XP了,以后可以逐渐考虑放弃ie6/7了!

Win7的市场份额终于超过XP了&#xff0c;以后可以逐渐考虑放弃ie6/7了&#xff01; 开心啊&#xff0c;诸位web开发们…… 图片来源&#xff1a;http://thenextweb.com/microsoft/2012/09/01/windows-7-finally-overtakes-windows-xp-mac-os-x-overtakes-windows-vista/

写出漂亮的代码

转自&#xff1a;http://blog.csdn.net/fuyuwei2015/article/details/46552697 1&#xff09;移除你没有用到的东西&#xff08;就像上面建议的一样&#xff09;。 2&#xff09;简化必要的概念&#xff0c;避免不必要的概念。 3&#xff09;移除不必要的抽象&#xff0c;用实际…

php 垂直搜死哦,垂直搜索(Vertical Search)的详细介绍

垂直搜索是相对于通用的搜索来说的&#xff0c;垂直搜索是通用搜索引擎的一种细化&#xff0c;垂直搜索专注于某一个特定行业的搜索&#xff0c;搜索的内容更加专一化&#xff0c;比如购物的内容&#xff0c;机械产品的内容&#xff0c;服务信息的内容等&#xff0c;是某一个行…

URL编码表一览

?退格TAB换行回车空格!"#$%&()*,-./%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f0123456789:;<>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_%30%31%32%33%34%…

SWIFT推送之本地推送(UILocalNotification)之二带按钮的消息

上一篇讲到的本地推送是普通的消息推送&#xff0c;本篇要讲一下带按钮动作的推送消息&#xff0c;先上个图瞅瞅&#xff1a; 继上一篇的内容进行小小的改动&#xff1a; 在didFinishLaunchingWithOptions方法内进行以下修改 123456789101112131415161718192021222324252627282…