【题目大意】
给定n个点,求每个点到离他最近点的距离。
【算法分析】
V图什么的,最讨厌了。。。
我直接就暴力了。。。
按x把点排序,然后按j递增序,枚举i-j的点和i+j的点。如果(a[i].x-a[i-j].x)^2 > dis && (a[i].x-a[i+j].x)^2 > dis
那么就break吧。
复杂度还是n^2的。
其中dis为之前枚举所得的较优解。
【其它】果断排到超级后面。
叉姐说,见到题目要先水一水,水不过再切。。。= =
【CODE】
#include
#define Sqr(x) ((lld)(x)*(lld)(x))
using namespace std;
typedef long long lld;
const lld INF=(lld)(2000000000)*(lld)(2000000000);
int Tc;
int n;
struct Point{int x,y,pos; lld dis;}a[105555];
bool cmp(Point A,Point B){
return A.x
void init(){
scanf("%d",&n);
int i;
for (i=1;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].pos=i;
}
sort(a+1,a+n+1,cmp);
}
void work(){
int i,j;
bool flag;
lld tmp;
for (i=1;i<=n;i++){
a[i].dis=INF;
for (j=1;(i-j>=1 || i+j<=n);j++){
flag=false;
if (i-j>=1 && Sqr(a[i].x-a[i-j].x) tmp=dis(a[i],a[i-j]);
if (tmp flag=true;
}
if (i+j<=n && Sqr(a[i+j].x-a[i].x) tmp=dis(a[i],a[i+j]);
if (tmp flag=true;
}
if (!flag) break;
}
}
}
bool cmp2(Point A,Point B){
return A.pos
void output(){
sort(a+1,a+n+1,cmp2);
for (int i=1;i<=n;i++)
printf("%I64dn",a[i].dis);
}
int main(){
scanf("%d",&Tc);
for (int i=0;i
work();
output();
}
}
求复杂度低于O(n^2)的算法
回复oimaster:好像可以用一个叫什么平面Hash的。。。
回复WJBZBMR:真诚求捉法
回复oimaster:Orz神牛!!!本菜怎么可能会。。只是听说过。。。
回复WJBZBMR:我只知道可以利用线性关系得到一系列’0′,’1’的数字来hash- -我出过规模小的题目
AC这题的不会都是用N^2的算法加优化吧………除了Edward,其他人最慢的只要7000+ms,优化何其犀利-v-
草。这题居然被你水了。正解不就是V图或者kd-Tree吗。一个O(N log N)一个O(N Sqrt(N))。
回复ftiasch:叉姐超级V5不解释。。。
这个题的反例不好造~你按XY排序 找比较好的一维 暴力就是Nsqrt(N)