Sol

$$Dis(A,B)=\pm (x_A-x_B)\pm (y_A-y_B)$$ 这样就有4种结果,然后A,B位置可以互换,这样就是8种了...然后分成8个部分...唔...好像是这样吧..

(欢迎打脸~)

(这个也是我自己yy的qwq.可能不太完整,甚至是错误的...不过欢迎来打脸...)

PS:代码调试宛如智障.

Code

#include<cstdio>
#include<cstring>
#include<vector>
#include<utility>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;

#define mpr(a,b) make_pair(a,b)
const int N = 50005;

int n,ans;
struct seat{ int x,y,id; }a[N],b[N];
bool operator < (const seat &a,const seat &b){ return a.x==b.x?a.y>b.y:a.x>b.x; }
int d[N<<1],id[N<<1],cnt,ys[N];
struct Edge{ int u,v,w; };
bool operator < (const Edge &a,const Edge &b){ return a.w>b.w; }
priority_queue<Edge> q;
int f[N];

inline int in(int x=0,char ch=getchar(),int v=1){
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();if(ch=='-') v=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*v; }
//int cmpx(const seat &a,const seat &b){ return a.x==b.x?a.x<b.x:a.y<b.y; }
//int cmpxy(const seat &a,const seat &b){ return a.y-a.x<b.y-b.x; }
inline int abs(int x){ return x<0?-x:x; }
int find(int x){ return f[x]==x?x:f[x]=find(f[x]); }
int dis=abs(a[u].x-a[v].x)+abs(a[u].y-a[v].y);
q.push((Edge){ u,v,dis });
}
for(;x;x-=x&-x) if(d[x]>v) d[x]=v,id[x]=pos;
}
int Query(int x){
int minv=0x7f7f7f7f,pos=-1;
for(;x<=cnt;x+=x&-x) if(d[x]<minv) minv=d[x],pos=id[x];
return pos;
}
void out(seat a){ cout<<a.x<<" "<<a.y<<" "<<a.id<<endl<<"***************\n"; }
void Build(){
/*        Part1 x1>x0&&y1-x1>y0-x0     dis=(x1+y1)-(x0+y0)         */
memset(d,0x7f,sizeof(d)),memset(id,-1,sizeof(id)),memset(ys,0,sizeof(ys));cnt=0;
for(int i=1;i<=n;i++) b[i]=a[i];
//  for(int i=1;i<=n;i++) out(a[i]);
sort(b+1,b+n+1);
//  for(int i=1;i<=n;i++) out(b[i]);
for(int i=1;i<=n;i++) ys[i]=b[i].y-b[i].x;
sort(ys+1,ys+n+1);
cnt=unique(ys+1,ys+n+1)-ys-1;

//  cout<<cnt<<endl;
//  for(int i=1;i<=cnt;i++) cout<<ys[i]<<" ";cout<<endl;

for(int i=1;i<=n;i++){
int x=lower_bound(ys+1,ys+cnt+1,b[i].y-b[i].x)-ys;
int pos=Query(x);
//      cout<<b[i].id<<"-->"<<pos<<endl;
}
/*        Part2 swap(x,y)                                            */
memset(d,0x7f,sizeof(d)),memset(id,-1,sizeof(id)),memset(ys,0,sizeof(ys));cnt=0;
for(int i=1;i<=n;i++) b[i].y=a[i].x,b[i].x=a[i].y,b[i].id=a[i].id;
sort(b+1,b+n+1);
//  for(int i=1;i<=n;i++) out(b[i]);
for(int i=1;i<=n;i++) ys[i]=b[i].y-b[i].x;
sort(ys+1,ys+n+1);
cnt=unique(ys+1,ys+n+1)-ys-1;

//  cout<<cnt<<endl;
//  for(int i=1;i<=cnt;i++) cout<<ys[i]<<" ";cout<<endl;

for(int i=1;i<=n;i++){
int x=lower_bound(ys+1,ys+cnt+1,b[i].y-b[i].x)-ys;
int pos=Query(x);
//      cout<<b[i].id<<"-->"<<pos<<endl;
}

/*        Part3 y=-y                                                 */
memset(d,0x7f,sizeof(d)),memset(id,-1,sizeof(id)),memset(ys,0,sizeof(ys));cnt=0;
for(int i=1;i<=n;i++) b[i]=a[i],b[i].y=-b[i].y;
sort(b+1,b+n+1);
//  for(int i=1;i<=n;i++) out(b[i]);
for(int i=1;i<=n;i++) ys[i]=b[i].y-b[i].x;
sort(ys+1,ys+n+1);
cnt=unique(ys+1,ys+n+1)-ys-1;

//  cout<<cnt<<endl;
//  for(int i=1;i<=cnt;i++) cout<<ys[i]<<" ";cout<<endl;

for(int i=1;i<=n;i++){
int x=lower_bound(ys+1,ys+cnt+1,b[i].y-b[i].x)-ys;
int pos=Query(x);
//      cout<<b[i].id<<"-->"<<pos<<endl;
}

/*        Part4 swap(x,y) y=-y                                       */
memset(d,0x7f,sizeof(d)),memset(id,-1,sizeof(id)),memset(ys,0,sizeof(ys));cnt=0;
for(int i=1;i<=n;i++) b[i].x=-a[i].y,b[i].y=a[i].x,b[i].id=a[i].id;
sort(b+1,b+n+1);
//  for(int i=1;i<=n;i++) out(b[i]);
for(int i=1;i<=n;i++) ys[i]=b[i].y-b[i].x;
sort(ys+1,ys+n+1);
cnt=unique(ys+1,ys+n+1)-ys-1;

//  cout<<cnt<<endl;
//  for(int i=1;i<=cnt;i++) cout<<ys[i]<<" ";cout<<endl;

for(int i=1;i<=n;i++){
int x=lower_bound(ys+1,ys+cnt+1,b[i].y-b[i].x)-ys;
int pos=Query(x);
//      cout<<b[i].id<<"-->"<<pos<<endl;
}
/*         MST                                                       */
for(int i=1;i<=n;i++) f[i]=i;
for(int k=1;!q.empty();){
Edge e=q.top();q.pop();
int u=e.u,v=e.v;
int f1=find(u),f2=find(v);
if(f1!=f2) k++,f[f2]=f1,ans+=e.w;
if(k>=n) break;
}cout<<ans<<endl;
}
int main(){
//  freopen("in.in","r",stdin);
//  freopen("out.out","w",stdout);
n=in();for(int i=1;i<=n;i++) a[i].x=in(),a[i].y=in(),a[i].id=i;
Build();
return 0;
}

BZOJ 2177: 曼哈顿最小生成树的更多相关文章

1. BZOJ.2177.曼哈顿最小生成树(Kruskal)

$$Solution$$ 参考 对于每个点,向唯一有可能与它形成MST的8个点连边,由于是双向单边,所以每个点最多连出4条边(证明见blog) 怎么找到一个区域内最近的点? 只考虑y轴右侧45°的区域 ...

2. 【BZOJ-2177】曼哈顿最小生成树 Kruskal + 树状数组

2177: 曼哈顿最小生成树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 190  Solved: 77[Submit][Status][Discu ...

3. POJ3241 Object Clustering 曼哈顿最小生成树

题意:转换一下就是求曼哈顿最小生成树的第n-k条边 参考:莫涛大神的论文<平面点曼哈顿最小生成树> /* Problem: 3241 User: 96655 Memory: 920K Ti ...

4. POJ 3241 Object Clustering 曼哈顿最小生成树

Object Clustering   Description We have N (N ≤ 10000) objects, and wish to classify them into severa ...

5. [BZOJ 1016] [JSOI2008] 最小生成树计数 【DFS】

题目链接:BZOJ - 1016 题目分析 最小生成树的两个性质: 同一个图的最小生成树,满足: 1)同一种权值的边的个数相等 2)用Kruscal按照从小到大,处理完某一种权值的所有边后,图的连通性 ...

6. BZOJ 3732: Network 最小生成树 倍增

3732: Network 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 &l ...

7. [BZOJ]1016 JSOI2008 最小生成树计数

最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...

8. 老oj曼哈顿最小生成树

Description 平面坐标系xOy内,给定n个顶点V = (x , y).对于顶点u.v,u与v之间的距离d定义为|xu – xv| + |yu – yv| 你的任务就是求出这n个顶点的最小生成 ...

9. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

随机推荐

1. swift 可选类型（optional）--- swift 入门

一.思维导图 二.代码 //这样无形中就会让代码很丑陋 if x != nil && y != nil { print("x或y都不等于空") } print(&q ...

3. 年终汇报、总结、述职：教你做一场B格满满的技术大会演讲

什么样的演讲和呈现最受听众欢迎,内容干货?逻辑清晰?长相帅气? 偶尔被邀作为speaker参加一些圈内的技术大会进行演讲.这里我分享下自己的经验,如何做一场B格满满的技术大会演讲,希望给做汇报.总结. ...

4. BizTalk 开发系列(四十二) 为BizTalk应用程序打包不同的环境Binding

我们在使用微软或者其他公司提供的BizTalk应用程序MSI包的时候经常会有一个目标环境的选择选项.该选项可以在不同的环境下使用不同的绑定(BizTalk应用程序配置)感觉很高级. 其实这个非常的简单 ...

5. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q97-Q99)

04 }Which code segment should you add at line 03?A. currentItem["ClassificationMetadata"] ...

6. C++ STL 迭代器失效问题

之前看<C++ Primier>的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究.今天写程序的时候遇到了这个问题. 1 莫名其妙的Erase 最初我 ...

7. 设计模式 --- 单例模式（Singleton）

一.概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如 ...

8. windows下的node-canvas历程

背景:由于在前期开发的过程中,对前端的小图片采用了css-sprite,开始的时候都是在http://spritegen.website-performance.org/站点上合成图片及样式的,但是某 ...

9. Windows 7系统安装MySQL5.5.21图解

Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中.小型关系型数据库管理系统,非常具有有用性,对于我们学习非常多技术都有帮助,前几天我分别装了SQL Server 2008和Or ...

10. HDU-1034(简单模拟)

Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...