转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
这个结论可以证明如下:假设我们以点A为原点建系,考虑在y轴向右45度区域内的任意两点B(x1,y1)和C(x2,y2),不妨设|AB|≤|AC|(这里的距离为曼哈顿距离),如下图:
|AB|=x1+y1,|AC|=x2+y2,|BC|=|x1-x2|+|y1-y2|。而由于B和C都在y轴向右45度的区域内,有y-x>0且x>0。下面我们分情况讨论:
1. x1>x2且y1>y2。这与|AB|≤|AC|矛盾;
2. x1≤x2且y1>y2。此时|BC|=x2-x1+y1-y2,|AC|-|BC|=x2+y2-x2+x1-y1+y2=x1-y1+2*y2。由前面各种关系可得y1>y2>x2>x1。假设|AC|<|BC|即y1>2*y2+x1,那么|AB|=x1+y1>2*x1+2*y2,|AC|=x2+y2<2*y2<|AB|与前提矛盾,故|AC|≥|BC|;
3. x1>x2且y1≤y2。与2同理;
4. x1≤x2且y1≤y2。此时显然有|AB|+|BC|=|AC|,即有|AC|>|BC|。
综上有|AC|≥|BC|,也即在这个区域内只需选择距离A最近的点向A连边。
转自: http://blog.csdn.net/huzecong/article/details/8576908#include
#include
#include
#define lowbit(x) (x&(-x))
using namespace std;
const int N = 100005;
struct Point{
int x,y,id;
bool operator<(const Point p)const{
return x!=p.x?x=1;i-=lowbit(i))
if(val=0;i--){
int pos=lower_bound(b,b+m,a[i])-b+1; //BIT中从1开始
int ans=ask(pos,m);
if(ans!=-1)
addedge(p[i].id,p[ans].id,dist(i,ans));
update(pos,p[i].x+p[i].y,i);
}
}
sort(e,e+tot);
int cnt=n-k;
for(int i=0;i