【HDOJ】4347 The Closest M Points
居然是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的更多相关文章
- 【BZOJ】3053: The Closest M Points(kdtree)
http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...
- 【kd-tree】bzoj3053 The Closest M Points
同p2626.由于K比较小,所以不必用堆. #include<cstdio> #include<cstring> #include<cmath> #include& ...
- bzoj 3053 HDU 4347 : The Closest M Points kd树
bzoj 3053 HDU 4347 : The Closest M Points kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差 ...
- HDU 4347 - The Closest M Points - [KDTree模板题]
本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...
- hdu 4347 The Closest M Points (kd树)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4347 题意: 求k维空间中离所给点最近的m个点,并按顺序输出 . 解法: kd树模板题 . 不懂kd树的可以先看看这个 . 不多说, ...
- hdu 4347 The Closest M Points(KD树)
Problem - 4347 一道KNN的题.直接用kd树加上一个暴力更新就撸过去了.写的时候有一个错误就是搜索一边子树的时候返回有当前层数会被改变了,然后就直接判断搜索另一边子树,搞到wa了半天. ...
- 数据结构(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 ...
- HDU 4347 The Closest M Points (kdTree)
赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...
- hud 4347 The Closest M Points(KD-Tree)
传送门 解题思路 \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割.它的插入删除复杂度为\(log^2 n\),它查 ...
随机推荐
- js中的异常处理try...catch使用介绍
在JavaScript可以使用try...catch来进行异常处理. 例如: try { foo.bar();} catch (e) { alert(e.name + ": " + ...
- .NET基础之深度复制和浅度复制
之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉. 如果大家不懂值类型和引用类型的区别,请先看http://www.cnblogs.com/Autumo ...
- 1036. Boys vs Girls (25)
#include <stdio.h>#include <string.h>int main(){ int n,i; while(scanf("%d",&am ...
- go语言使用protobuf
网上为什么充斥着大量几乎一模一样而且不正确的教程??? 妈的打开一个关于golang和protobuf的教程,无非都是protobuf多么多么牛逼,xml多么多么傻逼,然后就是怎么安装protobuf ...
- (转)使用Migrations更新数据库结构(Code First )
原文地址:http://blog.csdn.net/luoyeyu1989/article/details/8275237 背景 code first起初当修改model后,要持久化至数据库中时,总要 ...
- 【学习总结】【多线程】 多线程概要 & GDC & NSOperation
基本需要知道的 : 进程 : 简单点来说就是,操作系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在受保护的内存空间内 线程 : 一个进程(进程)想执行任务,必须有线程(所以, ...
- 【BZOJ 2301】[HAOI2011]Problem b
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- 用in判断input中的placeholder属性是否在这个对象里
<input id="test"> var ele = document.getElementById("test"); if("plac ...
- 团体程序设计天梯赛-练习集L2-004. 这是二叉搜索树吗
L2-004. 这是二叉搜索树吗? 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一棵二叉搜索树可被递归地定义为具有下列性质的 ...
- Samza文档翻译 : Concepts
此页介绍啊Samza的一些高层级概念. Streams Samza处理Streams(流).流由同一类型的不可变的消息组成.例如,一个流可以是对一个网站的所有点击,或者对一个数据库表的所有更新,或者一 ...