【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\),它查 ...
随机推荐
- [DevExpress]ChartControl之饼状图百分比示例
关键代码: using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; name ...
- MySQL的varchar定义长度到底是字节还是字符
相信这个问题也会困扰不少人,尤其是使用过其它数据库(如Oracle)的人,之前我也没有太在意这个问题,再加上一些书籍和网上的文章讲的不够细致,又没测试过,导致我一直理解错误.下面通过实例来解释,在开始 ...
- 深入理解jsavascript的作用域
一. JavaScript声明提前 在JavaScript中如果不创建变量,直接去使用,则报错: console.log(xxoo); // 报错:Uncaught ReferenceError: x ...
- @properties指针说明
在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, ...
- 区间型动规--石子归并(Pascal)
题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...
- Lua基础之coroutine(协程)
概括:1.创建协程2.coroutine的函数3.coroutine的基本流程4.yield对coroutine流程的干预5.resume, function()以及yield之间的参数传递和返回值传 ...
- 使用MyBatis的resultMap高级查询时常用的方式总结
以下内容已经通过楼主测试, 从pd设计数据库到测试完成, 之前楼主也没有过Mybatis 使用resultMap觉得有点乱,最近抽出时间总结了一下也算对MyBatis的resultMap进行一次系统的 ...
- 原生JS的对象常用操作总结
前端时间写了篇怎么判断js对象相等的文章,一直在期待大神给点消息,无奈一直杳无音讯,还是自己写个函数来进行判断,下面总结一些常用的对象操作的方法. 咋们来个先抑后扬的方式,先放出几个基本的 ...
- 2326: [HNOI2011]数学作业 - BZOJ
首先是DP,分段DP(按位数讨论) 然后每一段构造出它对应的矩阵,用矩阵快速幂加速 type matrix=..,..]of int64; var n,m:int64; a,b,c,d:matrix; ...
- 10个CSS简写/优化技巧
CSS简写就是指将多行的CSS属性简写成一行,又称为CSS代码优化或CSS缩写.CSS 简写的最大好处就是能够显著减少CSS文件的大小,优化网站整体性能,更加容易阅 读. 下面介绍常见的CSS简写规则 ...