poj 1984 Navigation Nightmare(带权并查集+小小的技巧)
题目链接:http://poj.org/problem?id=1984
题意:题目是说给你n个线,并告知其方向,然后对于后面有一些询问,每个询问有一个时间点,要求你输出在该时间点a,b的笛卡尔距离,如果不存在则输出-1
其实就是将权值分一下x,y,x表示x轴方向的权值,y表示y轴方向的权值。然后最后询问时稍微有点技巧
可以先记录一下每次询问的位置然后再按照时间点从小到大来排序最后这样就方便并查集了。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
const int M = 4e4 + 10;
int n , m , f[M] , ans[M];
struct TnT {
int x , y , num , pos , sum;
char aim;
}root[M] , T[M] , qu[M];
bool cmp(TnT a , TnT b) {
return a.num < b.num;
}
int find(int x) {
if(x == f[x])
return x;
int tmp = find(f[x]);
root[x].x += root[f[x]].x;
root[x].y += root[f[x]].y;
return f[x] = tmp;
}
void Union(int x , int y , int addx , int addy) {
int a = find(x) , b = find(y);
if(a != b) {
f[a] = b;
root[a].x = root[y].x - root[x].x - addx;
root[a].y = root[y].y - root[x].y - addy;
}
}
int main() {
int x , y , l , q;
char cp[2];
scanf("%d%d" , &n , &m);
for(int i = 1 ; i <= m ; i++) {
scanf("%d%d%d%s" , &x , &y , &l , cp);
T[i].x = x , T[i].y = y , T[i].sum = l , T[i].aim = cp[0];
}
for(int i = 1 ; i <= n ; i++) {
f[i] = i , root[i].x = 0 , root[i].y = 0;
}
scanf("%d" , &q);
for(int i = 1 ; i <= q ; i++) {
scanf("%d%d%d" , &qu[i].x , &qu[i].y , &qu[i].num);
qu[i].pos = i;
}
sort(qu + 1 , qu + 1 + q , cmp);
int temp = 1;
for(int i = 1 ; i <= q ; i++) {
for(int j = temp ; j <= qu[i].num ; j++) {
x = T[j].x , y = T[j].y , l = T[j].sum;
if(T[j].aim == 'W')
Union(x , y , -l , 0);
if(T[j].aim == 'E')
Union(x , y , l , 0);
if(T[j].aim == 'N')
Union(x , y , 0 , l);
if(T[j].aim == 'S')
Union(x , y , 0 , -l);
}
temp = qu[i].num + 1;
int a = find(qu[i].x) , b = find(qu[i].y);
if(a != b)
ans[qu[i].pos] = -1;
else
ans[qu[i].pos] = abs(root[qu[i].x].x - root[qu[i].y].x) + abs(root[qu[i].x].y - root[qu[i].y].y);
}
for(int i = 1 ; i <= q ; i++) {
printf("%d\n" , ans[i]);
}
return 0;
}
poj 1984 Navigation Nightmare(带权并查集+小小的技巧)的更多相关文章
- POJ 1984 - Navigation Nightmare - [带权并查集]
题目链接:http://poj.org/problem?id=1984 Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MS ...
- POJ 1984 Navigation Nightmare 带全并查集
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= ...
- BZOJ 3362 Navigation Nightmare 带权并查集
题目大意:给定一些点之间的位置关系,求两个点之间的曼哈顿距离 此题土豪题.只是POJ也有一道相同的题,能够刷一下 别被题目坑到了,这题不强制在线.把询问离线处理就可以 然后就是带权并查集的问题了.. ...
- POJ-1984-Navigation Nightmare+带权并查集(中级
传送门:Navigation Nightmare 参考:1:https://www.cnblogs.com/huangfeihome/archive/2012/09/07/2675123.html 参 ...
- POJ 1773 Parity game 带权并查集
分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2: ...
- POJ 1182 食物链 【带权并查集】
<题目链接> 题目大意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我 ...
- POJ 1182 食物链 (带权并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78551 Accepted: 23406 Description ...
- POJ 1182 食物链 【带权并查集/补集法】
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说 ...
- POJ 1733 Parity game (带权并查集)
题意:有序列A[1..N],其元素值为0或1.有M条信息,每条信息表示区间[L,R]中1的个数为偶数或奇数个,但是可能有错误的信息.求最多满足前多少条信息. 分析:区间统计的带权并查集,只是本题中路径 ...
随机推荐
- SpringBoot开发案例之打造十万博文Web篇
前言 通过 Python 爬取十万博文之后,最重要的是要让互联网用户访问到,那么如何做呢? 选型 从后台框架.前端模板.数据库连接池.缓存.代理服务.限流等组件多个维度选型. 后台框架 SpringB ...
- grep使用集合
一.grep使用 (一).选项 -a 不要忽略二进制数据. -A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容. -b 在显示符合范本样式的那一行之外,并显示该行之前 ...
- 作为前端的你,CC游戏开发可以上车
1. 初来乍到 打开 Cocos Creator 点击新建空白项目,在默认布局的左下区域,一个黄黄assets文件夹映入眼帘.作为前端的你对这个文件是不是再熟悉不过了.是的,和你想象的一样,开发游戏中 ...
- 使用RedisMQ 做一次分布式改造
引言 熟悉TPL Dataflow博文的朋友可能记得这是个单体程序,使用TPL Dataflow 处理工作流任务, 在使用Docker部署的过程中, 有一个问题一直无法回避: 在单体程序部署的瞬间会有 ...
- Starling 环形进度条实现
项目初期想实现这个效果来着,查了很多资料(包括式神的<神奇的滤镜>),也没找到完美的实现方法,,当时时间紧迫,就找了传统的进度条来代替实现. 最近偶然心血来潮,查了各方面资料,终于找到实现 ...
- golang timeoutHandler解析及kubernetes中的变种
Golang里的http request timeout比较简单,但是稍不留心就容易出现错误,最近在kubernetes生产环境中出现了的一个问题让我有机会好好捋一捋golang中关于timeout中 ...
- 章节十五、7- 配置文件-Console Logging
一.创建xml文件 1.创建xml文件 在项目中我们需要专门建一个文件夹来放xml文件或者是其它文件. 2.然后对文件夹进行命名 3.选择new 其它 4.选择XML File 5.给xml文件命名 ...
- 手写Struts,带你深入源码中心解析
个人剖析,不喜勿喷 扫码关注公众号,不定期更新干活 在此申明本博文并非原创,原文:http://blog.csdn.net/lenotang/article/details/3336623,本文章是在 ...
- IDEA搭建工程
1. 创建一个Project File -> New -> Project... : 选择jdk版本,然后Next: 输入项目名,确定项目路径,Finish. 2. 创建一个Modul ...
- 最大层内元素和----leetcode周赛150_1002
题目描述: 给你一个二叉树的根节点 root.设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推. 请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 ...