题目大意:给定一些点之间的位置关系,求两个点之间的曼哈顿距离

此题土豪题。只是POJ也有一道相同的题,能够刷一下

别被题目坑到了,这题不强制在线。把询问离线处理就可以

然后就是带权并查集的问题了。。

将权值设为方向向量,重载+和-,依照正常权值并查集做即可了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 40400
using namespace std;
struct abcd{
int x,y;
abcd(){}
abcd(int X,int Y):x(X),y(Y){}
abcd operator + (const abcd &Y) const
{
return abcd( x+Y.x , y+Y.y );
}
abcd operator - (const abcd &Y) const
{
return abcd( x-Y.x , y-Y.y );
}
}f[M];
struct operation{
int x,y;
abcd temp;
}operations[M];
struct query{
int x,y,z,pos;
bool operator < (const query &Y) const
{
return z < Y.z ;
}
}queries[10100];
int n,m,q,fa[M],ans[10100];
int Distance(abcd x)
{
return abs(x.x)+abs(x.y);
}
int Find(int x)
{
if(!fa[x]||fa[x]==x)
return fa[x]=x;
int y=fa[x];
fa[x]=Find(fa[x]);
f[x]=f[y]+f[x];
return fa[x];
}
int main()
{
int i,j,x,y,z;
char p[10];
cin>>n>>m;
for(i=1;i<=m;i++)
{
scanf("%d%d%d%s",&operations[i].x,&operations[i].y,&z,p);
switch(p[0])
{
case 'E':operations[i].temp=abcd(z,0);break;
case 'W':operations[i].temp=abcd(-z,0);break;
case 'N':operations[i].temp=abcd(0,z);break;
case 'S':operations[i].temp=abcd(0,-z);break;
}
}
cin>>q;
for(i=1;i<=q;i++)
scanf("%d%d%d",&queries[i].x,&queries[i].y,&queries[i].z),queries[i].pos=i;
sort(queries+1,queries+q+1);
for(i=1,j=1;i<=q;i++)
{
for(;j<=queries[i].z;j++)
{
int x=operations[j].x;
int y=operations[j].y;
int fx=Find(x),fy=Find(y);
fa[fy]=fx;
f[fy]=f[x]-f[y]+operations[j].temp;
}
int x=queries[i].x;
int y=queries[i].y;
if( Find(x)!=Find(y) )
ans[queries[i].pos]=-1;
else
ans[queries[i].pos]=Distance(f[x]-f[y]);
}
for(i=1;i<=q;i++)
printf("%d\n",ans[i]);
}

BZOJ 3362 Navigation Nightmare 带权并查集的更多相关文章

  1. POJ 1984 - Navigation Nightmare - [带权并查集]

    题目链接:http://poj.org/problem?id=1984 Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MS ...

  2. POJ-1984-Navigation Nightmare+带权并查集(中级

    传送门:Navigation Nightmare 参考:1:https://www.cnblogs.com/huangfeihome/archive/2012/09/07/2675123.html 参 ...

  3. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  4. POJ 1984 Navigation Nightmare 带全并查集

    Navigation Nightmare   Description Farmer John's pastoral neighborhood has N farms (2 <= N <= ...

  5. 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)

    题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...

  6. 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    [bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 ​ 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...

  7. 【POJ 1984】Navigation Nightmare(带权并查集)

    Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...

  8. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

  9. POJ1984:Navigation Nightmare(带权并查集)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7871   Accepted: 2 ...

随机推荐

  1. hibernate 关系映射之 主键关联一对一

    单向双向在数据库中没有区别,但是在java程序中有区别.   在程序中:双向的通过一个就可以找到另一个,单向的通过设置了对应关系的类可以找到它所对应的类,反过来就不行.   注解方式单向主键关联: 和 ...

  2. golang中使用mongodb的操作类以及如何封装

    mgo简介 mongodb官方没有关于go的mongodb的驱动,因此只能使用第三方驱动,mgo就是使用最多的一种. mgo(音mango)是MongoDB的Go语言驱动,它用基于Go语法的简单API ...

  3. 中小型研发团队架构实践:分布式协调服务ZooKeeper

    一.ZooKeeper 是什么 Apache ZooKeeper 由 Apache Hadoop 的子项目发展而来,于 2010 年 11 月正式成为了 Apache 的顶级项目. 相关厂商内容 优秀 ...

  4. JS JSOP跨域请求实例详解

    JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下 ...

  5. 阿里云slb实现多域名https

    刚开始接锅,没注意原来站点的https配置在slb上,在服务器上配置一顿操作猛如虎,细细检查一遍,感觉良好,一测试发现不对劲,检查发现原来https配置在阿里云slb上,阿里云还是做得不错的 ,但是现 ...

  6. mysql-multi source replication 配置

    1.关键步骤 change master to master_host='172.16.192.201', master_port, master_user='repl', master_passwo ...

  7. Memcache应用场景介绍,说明[zz]

    转于:http://www.cnblogs.com/literoad/archive/2012/12/23/2830178.html 面临的问题 对于高并发高访问的 Web应用程序来说,数据库存取瓶颈 ...

  8. strlen函数实现

    原型: int strlen(const char *s); 作用:返回字符串的长度. 方法1:利用中间变量 int strlen(const char *s){ ; while(s[i] != '\ ...

  9. NGUI中获取鼠标在控件内部坐标

    在UIWidget 中添加以下函数.获得的坐标系是以右上角为原点坐标,x轴向左,一轴向下. public Vector2 GetTouchPoint() { Vector3 p0 =  cachedT ...

  10. 自己定义滑动删除item的ListView。

    首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类. 会使用到AbsList中的pointToPosition(int x, int y)方法 ...