Position:


List

Description

  • 大意:求曼哈顿距离最小生成树上第k大(第n-k小)的边

Knowledge

参考曼哈顿距离最小生成树
http://blog.csdn.net/yjpyjp2014/article/details/52180707

Solution

分析:
1.由上面资料可知,每45度的范围只算一个最近点
2.看下面一种情况:
      
对于下面那个点,上面的点在它的右上方。而它又在上面的点的左下方,故我们只需计算左上和右上,即角[0,180]的范围,每45度一个,每个点4个,故边数不超过4×n。
3-1.为了写代码的方便,我们每次将点翻转,只计算[45,90]范围的点。翻转:①第一次不翻②第二次将一个点的x与y交换(即沿y=x翻转,原本在[0,45]的点翻到了[45,90])③将x=-x,沿x=0翻转,左上翻到右上④
3-2.ZYT的写法(可能容易理解一点):我们只需考虑在一块区域内的点,其他区域内的点可以通过坐标变换“移动”到这个区域内。为了方便处理,我们考虑在y轴向右45度的区域。在某个点A(x0,y0)的这个区域内的点B(x1,y1)满足x1≥x0且y1-x1>y0-x0。这里对于边界我们只取一边,但是操作中两边都取也无所谓。那么|AB|=y1-y0+x1-x0=(x1+y1)-(x0+y0)。在A的区域内距离A最近的点也即满足条件的点中x+y最小的点。因此我们可以将所有点按x坐标排序,再按y-x离散,用线段树或者树状数组维护大于当前点的y-x的最小的x+y对应的点(也就是维护区间最小值)。时间复杂度O(NlogN)。至于坐标变换,一个比较好处理的方法是第一次直接做(R1==R5);第二次沿直线y=x翻转,即交换x和y坐标(R2==R6);第三次沿直线x=0翻转,即将x坐标取相反数(R7==R3);第四次再沿直线y=x翻转(R8==R4)。注意只需要做4次,因为边是双向的。
             
4.对于点(x,y)如果有一个点(x1,y1)在它的(45,90),只要满足y1-x1>y-x(证明:即用一条斜率为45的直线,过这个点,比截距的大小y=x+b,y-x=b,平面图知识qaq~)
5.按x坐标排序,从后往前扫,值域(y-x)树状数组,w记录的是曼哈顿距离,pos记录第几个点。

Notice

1.这是一个反的树状数组,c[i]记录i~i+lowbit(i)-1
2.因为只要求x~m的最小值,用树状数组可以

Code

// <ObjectClustering.cpp> - 08/11/16 16:35:38
// This file is made by YJinpeng,created by XuYike's black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don't know what this program is. #include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define MOD 1000000007
#define INF 1e9
#define EPS 1e-10
using namespace std;
typedef long long LL;
const int MAXN=10010;
const int MAXM=100010;
inline int max(int &x,int &y) {return x>y?x:y;}
inline int min(int &x,int &y) {return x<y?x:y;}
inline int getint() {
register int w=0,q=0;register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')q=1,ch=getchar();
while(ch>='0'&&ch<='9')w=w*10+ch-'0',ch=getchar();
return q?-w:w;
}
int n,m,k,tot,cnt,x,pos;
int f[MAXN],hs[MAXN],t[MAXN];
struct Point{
int x,y,id;
void read(){x=getint();y=getint();}
friend bool operator < (const Point &a,const Point &b) {
return a.x==b.x?a.y<b.y:a.x<b.x;
}
}p[MAXN];
struct Edge{
int u,v,w;
friend bool operator < (const Edge &a,const Edge &b){
return a.w<b.w;
}
}e[MAXN*4];
struct Bit{
int w,pos;
void Pre(){pos=-1,w=INF;}
}b[MAXN];
inline int Find(int x){return x==f[x]?x:f[x]=Find(f[x]);}
inline int Lowbit(int x){return x&(-x);}
int Dis(int a,int b){
return abs(p[a].x-p[b].x)+abs(p[a].y-p[b].y);
}
int Query(int x){
int M=INF,pos=-1;
for(int i=x;i<=m;i+=Lowbit(i))
if(b[i].w<M)M=b[i].w,pos=b[i].pos;
return pos;
}
void Update(int x,int M,int pos){
for(int i=x;i;i-=Lowbit(i))
if(M<b[i].w)b[i].w=M,b[i].pos=pos;
}
void Insert(int u,int v,int w){
e[++cnt].u=u;e[cnt].v=v;e[cnt].w=w;
}
void Caledge(){
sort(p+1,p+1+n);
for(int i=1;i<=n;i++)hs[i]=t[i]=p[i].y-p[i].x;
sort(hs+1,hs+1+n);
m=unique(hs+1,hs+1+n)-hs;
for(int i=1;i<=m;i++)b[i].Pre();
for(int i=n;i>=1;i--){
x=lower_bound(hs+1,hs+1+m,t[i])-hs+1;
pos=Query(x);
if(pos!=-1)Insert(p[i].id,p[pos].id,Dis(i,pos));
Update(x,p[i].x+p[i].y,i);
}
}
void Kruskal(){
sort(e+1,e+1+cnt);tot=0;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=cnt;i++){
f[e[i].u]=Find(f[e[i].u]);
f[e[i].v]=Find(f[e[i].v]);
if(f[e[i].u]!=f[e[i].v])f[f[e[i].u]]=f[e[i].v],tot++;
if(tot==k){printf("%d",e[i].w);break;}
}
}
int main()
{
freopen("ObjectClustering.in","r",stdin);
freopen("ObjectClustering.out","w",stdout);
n=getint();k=n-getint();
for(int i=1;i<=n;i++)p[i].read(),p[i].id=i;
for(int j=1;j<=4;j++){
if(j==2||j==4)
for(int i=1;i<=n;i++)swap(p[i].x,p[i].y);
else if(j==3)
for(int i=1;i<=n;i++)p[i].x=-p[i].x;
Caledge();
}
Kruskal();
return 0;
}

感谢

Friend ZYT的大力支持

【Poj3241】Object Clustering的更多相关文章

  1. 【poj3241】 Object Clustering

    http://poj.org/problem?id=3241 (题目链接) MD被坑了,看到博客里面说莫队要写曼哈顿最小生成树,我就写了一个下午..结果根本没什么关系.不过还是把博客写了吧. 转自:h ...

  2. 【POJ 3241】Object Clustering 曼哈顿距离最小生成树

    http://poj.org/problem?id=3241 曼哈顿距离最小生成树模板题. 核心思想是把坐标系转3次,以及以横坐标为第一关键字,纵坐标为第二关键字排序后,从后往前扫.扫完一个点就把它插 ...

  3. 前端开发者进阶之ECMAScript新特性【一】--Object.create

    Object.create(prototype, descriptors) :创建一个具有指定原型且可选择性地包含指定属性的对象 参数:prototype 必需.  要用作原型的对象. 可以为 nul ...

  4. 【转】object标签和embed标签

    我们现在大部分人做网页,都是直接用DW插入flash,而且DW也是所见即所得,直接生成了相应的flash显示代码.可是我们又有多少人了解这些直接由DW生成的代码呢?其实我接触flash player标 ...

  5. 【JavaScript】Object.observe()带来的数据绑定变革

    Object.observe()带来的数据绑定变革 引言 一场变革即将到来.一项Javascript中的新特性将会改变你对于数据绑定的所有认识.它也将改变你所使用的MVC库观察模型中发生的修改以及更新 ...

  6. 【原】Object 异常静态

    //所有的类都继承Object类: Object a=; Object b="ddfasfda"; //正常情况下,都会省略掉:Object:但实际上是存在的: class tes ...

  7. 【JavaScript】Object.prototype.toString.call()进行类型判断

    权声明:本文为博主原创文章,未经博主允许不得转载. op = Object.prototype, ostring = op.toString, ... function isFunction(it)  ...

  8. 为什么要用lock 【readonly】object?为什么不要lock(this)?

    一. 为什么要用lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了.也就是说 ...

  9. 【vue】---Object.defineProperty基本使用---【巷子】

    1.object.defineProperty 给一个对象定义一个新的属性或者在修改一个对象现有的属性,并返回这个对象 语法: Object.defineProperty(参数1,参数2,参数3) 参 ...

随机推荐

  1. 牛客多校Round 1

    Solved:1 rank:249 E. Removal dp i,j表示前i个数删除了j个且选择了第i个的答案 类似字符串的dp 预处理一下nex i_k即i后面k第一次出现的位置  就好转移了 # ...

  2. nginx平滑升级实战

    Nginx 平滑升级 1.查看旧版Nginx的编译参数 [root@master ~]# /usr/local/nginx/sbin/nginx -V [root@master ~]# ll ngin ...

  3. linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  4. 20.IO流部分笔记

    20.IO流部分笔记 2018/09/06 1.IO流  1.1 创建字节输出流对象,如果没有就自动创建一个 FileOutputStram fos = new FileOutputStram(&qu ...

  5. 洛谷——P2158 [SDOI2008]仪仗队

    P2158 [SDOI2008]仪仗队 找规律大水题嘛,如果你做过P1170 兔八哥与猎人 这题得到的规律是$a,b,c,d$,若$gcd(a-b,c-d)==1$ 那么$a,b$就能看到$c,d$ ...

  6. 面试总结——Java高级工程师(二)

    一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是 DispatcherServlet , 一个请求经过 Dispatc ...

  7. Linux学习笔记记录(九)

  8. python 配置文件 ConfigParser模块

    ConfigParser模块 用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式如下 [DEFAULT] Se ...

  9. LINUX驱动、系统底层

    就业模拟测试题-LINUX驱动.系统底层工程师职位 本试卷从考试酷examcoo网站导出,文件格式为mht,请用WORD/WPS打开,并另存为doc/docx格式后再使用 试卷编号:143921试卷录 ...

  10. [spoj1182][Sorted Bit Sequence] (数位dp)

    Description Let's consider the 32 bit representation of all integers i from m up to n inclusive (m ≤ ...