居然是KD解。

 /* 4347 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 int id, n, m, K; typedef struct node_t {
int x[]; friend bool operator< (const node_t& a, const node_t& b) {
return a.x[id] < b.x[id];
} double Distance(const node_t& a) {
__int64 ret = ; rep(i, , K)
ret += 1LL*(a.x[i]-x[i])*(a.x[i]-x[i]); return ret;
} void print() {
printf("%d", x[]);
rep(i, , K)
printf(" %d", x[i]);
putchar('\n');
} } node_t; typedef struct Node {
__int64 d;
node_t p; Node() {}
Node(__int64 d, node_t& p):
d(d), p(p) {} friend bool operator< (const Node& a, const Node& b) {
return a.d < b.d;
} } Node; const int maxn = ;
node_t nd[maxn];
vector<node_t> ans; typedef struct KD_tree{
static const int maxd = ;
static const int maxn = ;
node_t P[maxn<<];
int idx[maxn<<];
priority_queue<Node> Q; void Build(int deep, int l, int r, int rt) {
if (l > r)
return ;
idx[rt] = deep % K;
if (l == r) {
P[rt] = nd[l];
return ;
} id = idx[rt];
int mid = (l + r) >> ;
nth_element(nd+l, nd+mid, nd+r+);
P[rt] = nd[mid];
Build(deep+, l, mid-, rt<<);
Build(deep+, mid+, r, rt<<|);
} void Query(node_t x, int l, int r, int rt) {
if (l > r)
return ; int id = idx[rt];
__int64 tmp = x.Distance(P[rt]);
if (l == r) {
if (SZ(Q) < m) {
Q.push(Node(tmp, P[rt]));
} else {
if (tmp < Q.top().d) {
Q.pop();
Q.push(Node(tmp, P[rt]));
}
}
return ;
} int mid = (l + r) >> ; if (P[rt].x[id] >= x.x[id]) {
Query(x, l, mid-, rt<<);
if (SZ(Q) < m) {
Q.push(Node(tmp, P[rt]));
Query(x, mid+, r, rt<<|);
} else {
if (tmp < Q.top().d) {
Q.pop();
Q.push(Node(tmp, P[rt]));
}
if (1LL*(x.x[id]-P[rt].x[id])*(x.x[id]-P[rt].x[id]) < Q.top().d) {
Query(x, mid+, r, rt<<|);
}
}
} else {
Query(x, mid+, r, rt<<|);
if (SZ(Q) < m) {
Q.push(Node(tmp, P[rt]));
Query(x, l, mid-, rt<<);
} else {
if (tmp < Q.top().d) {
Q.pop();
Q.push(Node(tmp, P[rt]));
}
if (1LL*(x.x[id]-P[rt].x[id])*(x.x[id]-P[rt].x[id]) < Q.top().d) {
Query(x, l, mid-, rt<<);
}
}
}
} void Dump() {
ans.clr();
while (!Q.empty()) {
ans.pb(Q.top().p);
Q.pop();
}
}
} KD_tree; KD_tree kd; void solve() {
int q, sz;
node_t p; kd.Build(, , n-, );
scanf("%d", &q);
while (q--) {
rep(j, , K)
scanf("%d", &p.x[j]);
scanf("%d", &m);
kd.Query(p, , n-, );
kd.Dump();
sz = SZ(ans);
printf("the closest %d points are:\n", m);
per(i, , sz) {
ans[i].print();
}
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif while (scanf("%d %d", &n, &K)!=EOF) {
rep(i, , n)
rep(j, , K)
scanf("%d", &nd[i].x[j]);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

数据发生器。

 from copy import deepcopy
from random import randint, shuffle
import shutil
import string def GenDataIn():
with open("data.in", "w") as fout:
t = 10
bound = 10**5
for tt in xrange(t):
n = randint(100, 200)
k = randint(1, 5)
fout.write("%d %d\n" % (n, k))
for i in xrange(n):
L = []
for j in xrange(k):
x = randint(-1000, 1000)
L.append(x)
fout.write(" ".join(map(str, L)) + "\n")
q = randint(20, 30)
fout.write("%d\n" % (q))
for qq in xrange(q):
L = []
for j in xrange(k):
x = randint(-1000, 1000)
L.append(x)
fout.write(" ".join(map(str, L)) + "\n")
m = randint(1, 10)
fout.write("%d\n" % (m)) def MovDataIn():
desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
shutil.copyfile("data.in", desFileName) if __name__ == "__main__":
GenDataIn()
MovDataIn()

【HDOJ】4347 The Closest M Points的更多相关文章

  1. 【BZOJ】3053: The Closest M Points(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...

  2. 【kd-tree】bzoj3053 The Closest M Points

    同p2626.由于K比较小,所以不必用堆. #include<cstdio> #include<cstring> #include<cmath> #include& ...

  3. bzoj 3053 HDU 4347 : The Closest M Points kd树

    bzoj 3053 HDU 4347 : The Closest M Points  kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差 ...

  4. HDU 4347 - The Closest M Points - [KDTree模板题]

    本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...

  5. hdu 4347 The Closest M Points (kd树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4347 题意: 求k维空间中离所给点最近的m个点,并按顺序输出  . 解法: kd树模板题 . 不懂kd树的可以先看看这个 . 不多说, ...

  6. hdu 4347 The Closest M Points(KD树)

    Problem - 4347 一道KNN的题.直接用kd树加上一个暴力更新就撸过去了.写的时候有一个错误就是搜索一边子树的时候返回有当前层数会被改变了,然后就直接判断搜索另一边子树,搞到wa了半天. ...

  7. 数据结构(KD树):HDU 4347 The Closest M Points

    The Closest M Points Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Ot ...

  8. HDU 4347 The Closest M Points (kdTree)

    赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...

  9. hud 4347 The Closest M Points(KD-Tree)

    传送门 解题思路 \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割.它的插入删除复杂度为\(log^2 n\),它查 ...

随机推荐

  1. 数据库降级-从sqlserver 2008 降到 2005

    前天遇到一个问题,是一个数据库是Sqlserver 2008的,而平台数据库库是2005的,需要把2008的数据库附加进来,试了很多办法,现在觉得最好的办法就是导出导入办法. 第一步 新建一个Sqls ...

  2. angularJs--$apply和$watch,$digest方法的意思

    这个视图对应的控制器是 这样的话,这个date变量,是不会发生改变的,没有触发脏检查,所以这时候要$apply方法,所有自定义的方法都要用$apply来触发脏检查 这样那个日期就会变化了 $diges ...

  3. Android基于GridView实现的翻牌游戏效果

    好久没有写博客了,上一篇博文距现在都有三个多月了,实在是惭愧.但是这段时间仍然是在忙于项目或是自我充电.这几天实现了一个基于GridView的翻牌动画效果,这里就将其整理出来同各位分享. 一.整体介绍 ...

  4. dapper.rainbow

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  5. 直接下载完整chrome浏览器的方法

    目前通过下吗的链接可以获得独立的安装包. http://www.google.com/chrome/eula.html?standalone=1&hl=zh-CN

  6. 关于location

    ---恢复内容开始--- window.location跳转+替换+刷新 一.最外层top跳转页面,适合用于iframe框架集 top.window.location.href("${pag ...

  7. Python for 循环 失效

    昨天发现一个负责处理观察者模式的基类工作失败,默认的N个观察者负责处理 发送的一些东西, 其中提供一个内置接口移除观察者: def removeObserver(self, observer): if ...

  8. RichTextBox控件-主要用于输入输出编辑文本信息

    1.在RichTextBox控件中添加超链接文字 private void btn_Add_Click(object sender, EventArgs e) { rtbox_HyperLink.Ap ...

  9. linux 命令 备忘

    openssl rand -base64 32 随机数 date | md5sum data 日期 cal 日历 man -f man sync 数据同步写入磁盘 shutdown reboot ha ...

  10. 用JavaScript获取页面上被选中的文字的技巧

    这里介绍的一个小技巧是如何用JavaScript获取页面上被选中的文字的方法.最关键的JavaScript API是: event.selection = window.getSelection(); ...