【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)
题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离。问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则输出-1。
解法:带权并查集。sx[x]表示x与其根结点的横坐标的差,sy[x]表示x与其根结点的纵坐标的差。}
输入需要好好处理一下:1.我自定义(x,y,E)的x,y之间的横坐标差为正,W为负,N时的纵坐标差为正,S时为负;2.需要给询问排序,再一个个将关系存储下来。
注意——我将x,y合并联盟时的关系式就偷懒按 【poj 1182】食物链(图论--带权并查集) 所提到的用方块图直接推,发现样例对了,还1A了,速度也比较快!(我代码也算是很清晰的吧)❀(๑╯◡╰๑)❀ 所以我真的向神犇求解啊!!
P.S.我碰运气地没有完全推导、不负责任地打了ins( )里的式子,而对于这个hyc有另外的一种简单易懂的坐法:出现fx,x,fy,y,可知把fy附到x所在联盟下时,可以把 fy 和 y 颠倒相对位置,让输入的对于 x 和 y 的距离 d 可以直截了当地得到利用,赋值给“一身轻”的 y。
1 int fy=ffind(y);
2 sx[fy]=-sx[y],sy[fy]=-sy[y]; fa[fy]=y, fa[y]=x;
3 sx[y]=w[t][0]*d,sy[y]=w[t][0]*d;
下面是我的完整代码——
1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<algorithm>
5 #include<iostream>
6 using namespace std;
7
8 const int N=40010,M=40010,K=10010;
9 struct quiry{int x,y,t,id;}q[K];
10 struct node{int x,y,d,t;}a[M];
11 int n,m,k;
12 char s[3];
13 int fa[N],sx[N],sy[N],ans[K];
14 int w[5][2]={{1,0},{0,-1},{-1,0},{0,1}};//ESWN,multi
15
16 bool cmp(quiry x,quiry y) {return x.t<y.t;}
17 int mabs(int x) {return x>0?x:-x;}
18 int ffind(int x)
19 {
20 if (fa[x]!=x)
21 {
22 int fx=fa[x];
23 fa[x]=ffind(fx);
24 sx[x]+=sx[fx];
25 sy[x]+=sy[fx];
26 }
27 return fa[x];
28 }
29 void ins(int x,int y,int d,int t)
30 {
31 int fx=ffind(x),fy=ffind(y);
32 if (fx==fy) return;
33 fa[fy]=fx;
34 sx[fy]=w[t][0]*d+sx[x]-sx[y];//
35 sy[fy]=w[t][1]*d+sy[x]-sy[y];//
36 }
37 int solve(int x,int y)
38 {
39 int fx=ffind(x),fy=ffind(y);
40 if (fx!=fy) return -1;
41 return mabs(sx[x]-sx[y])+mabs(sy[x]-sy[y]);
42 }
43 int main()
44 {
45 scanf("%d%d",&n,&m);
46 for (int i=1;i<=m;i++)
47 {
48 scanf("%d%d%d%s",&a[i].x,&a[i].y,&a[i].d,s);
49 if (s[0]=='E') a[i].t=0;
50 if (s[0]=='S') a[i].t=1;
51 if (s[0]=='W') a[i].t=2;
52 if (s[0]=='N') a[i].t=3;
53 }
54 scanf("%d",&k);
55 for (int i=1;i<=k;i++)
56 {
57 scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].t);
58 q[i].id=i;
59 }
60 sort(q+1,q+1+k,cmp);
61 for (int i=1;i<=n;i++) fa[i]=i,sx[i]=sy[i]=0;
62 int t=0;
63 for (int i=1;i<=k;i++)
64 {
65 while (t<q[i].t && t<m) {t++; ins(a[t].x,a[t].y,a[t].d,a[t].t);}
66 ans[q[i].id]=solve(q[i].x,q[i].y);
67 }
68 for (int i=1;i<=k;i++) printf("%d\n",ans[i]);
69 return 0;
70 }
【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)的更多相关文章
- 【poj 1988】Cube Stacking(图论--带权并查集)
题意:有N个方块,M个操作{"C x":查询方块x上的方块数:"M x y":移动方块x所在的整个方块堆到方块y所在的整个方块堆之上}.输出相应的答案. 解法: ...
- 【poj 1962】Corporative Network(图论--带权并查集 模版题)
P.S.我不想看英文原题的,但是看网上题解的题意看得我 炒鸡辛苦&一脸懵 +_+,打这模版题的代码也纠结至极了......不得已只能自己翻译了QwQ . 题意:有一个公司有N个企业,分成几个网 ...
- 【POJ 1984】Navigation Nightmare(带权并查集)
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...
- POJ1984:Navigation Nightmare(带权并查集)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7871 Accepted: 2 ...
- poj 1984 Navigation Nightmare(带权并查集+小小的技巧)
题目链接:http://poj.org/problem?id=1984 题意:题目是说给你n个线,并告知其方向,然后对于后面有一些询问,每个询问有一个时间点,要求你输出在该时间点a,b的笛卡尔距离,如 ...
- 【bzoj 1202】[HNOI2005] 狡猾的商人(图论--带权并查集+前缀和)
题意:一个账本记录了N个月以来的收入情况,现在有一个侦探员不同时间偷看到M段时间内的总收入,问这个账本是否为假账. 解法:带权并查集+前缀和. 判断账本真假是通过之前可算到的答案与当前读入的值是否 ...
- 【poj 1182】食物链(图论--带权并查集)
题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- (中等) POJ 1703 Find them, Catch them,带权并查集。
Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...
随机推荐
- 【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization
Azure Active Directory (Azure AD) is Microsoft's cloud-based identity and access management service, ...
- 【RAC】打完补丁后,发现只有一台rac可以启动,另一台无法启动
安装11Gr2单机asm后,打完11.2.0.3.7的psu后,发现启动不起来数据库,alert日志内容如下: Errors in file /u01/app/oracle/diag/rdbms/bd ...
- 【Linux】常用的Linux可插拔认证模块(PAM)应用举例:pam_limits.so、pam_rootok.so和pam_userdb.so模块
常用的Linux可插拔认证模块(PAM)应用举例:pam_limits.so.pam_rootok.so和pam_userdb.so模块 pam_limits.so模块: pam_limits.so模 ...
- 【Azure 存储服务】Python模块(azure.cosmosdb.table)直接对表存储(Storage Account Table)做操作示例
什么是表存储 Azure 表存储是一项用于在云中存储结构化 NoSQL 数据的服务,通过无结构化的设计提供键/属性存储. 因为表存储无固定的数据结构要求,因此可以很容易地随着应用程序需求的发展使数据适 ...
- 使用Spring的RestTemplate进行接口调用
引自:http://www.zimug.com/ 1.常见的http服务的通信方式 经常使用的方式有HttpClient.OkHttp.RestTemplate.其中RestTemplate是一种更优 ...
- 解决JS获取中文参数出现的乱码问题
在代码中增加如下js函数: function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + " ...
- 数据库 | 001-MySQL梳理系列(一)
MySQL基本组成 SQL执行流程 Server 层主要包括连接器.查询缓存.分析器.优化器.执行器,包含了MySQL主要的很多核心功能,以及所有的内置函数.存储过程.触发器.视图等,其实就是所有跨存 ...
- 30分钟带你了解「消息中间件」Kafka、RocketMQ
消息中间件的应用场景 主流 MQ 框架及对比 说明 Kafka 优点 Kafka 缺点 RocketMQ Pulsar 发展趋势 各公司发展 Kafka Kafka 是什么? Kafka 术语 Kaf ...
- Redis 实战 —— 07. 复制、处理故障、事务及性能优化
复制简介 P61 关系型数据库通常会使用一个主服务器 (master) 向多个从服务器 (slave) 发送更新,并使用从服务器来处理所有读请求. Redis 也采用了同样的方法实现自己的复制特性,并 ...
- 转 1 认识开源性能测试工具jmeter
1 认识开源性能测试工具jmeter 典型的性能测试工具主要有2个,Load Runner和jmeter.Load Runner是商业化的,Jmeter是开源的.下面我们认识一下开源性能测试工具j ...