poj1984 带权并查集
题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1。
只要在元素的权值上保存两个信息,与祖先元素的两个方向的差,我选择正东和正北方向差(负值表示正西和正南),然后直接用带权并查集,询问时曼哈顿距离就是两个权值的绝对值之和。由于询问是嵌在给出关系中间的,所以要先存下所有关系和询问,离线做就行。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=4e4+; int fa[maxm],north[maxm],east[maxm];
int a[maxm],b[maxm],l[maxm],ans[];
char s[maxm][];
struct que{
int num,a,b,t;
bool operator < (const que a)const{
return t<a.t;
}
}q[]; int abs(int a){return a>?a:-a;} void init(int n){
for(int i=;i<=n;++i){
fa[i]=i;
north[i]=east[i]=;
}
} int find(int x){
int r=x,t1,t2,t3,cn=,ce=;
while(r!=fa[r]){
cn+=north[r];
ce+=east[r];
r=fa[r];
}
while(x!=r){
t1=fa[x];
t2=cn-north[x];
t3=ce-east[x];
north[x]=cn;
east[x]=ce;
fa[x]=r;
cn=t2;
ce=t3;
x=t1;
}
return r;
} int main(){
int n,m;
scanf("%d%d",&n,&m);
init(n);
for(int i=;i<=m;++i)scanf("%d%d%d%s",&a[i],&b[i],&l[i],s[i]);
int k;
scanf("%d",&k);
for(int i=;i<=k;++i){
scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].t);
q[i].num=i;
}
sort(q+,q+k+);
int pos=;
for(int i=;i<=m;++i){
int x=find(a[i]),y=find(b[i]);
int Cn=,Ce=;
if(s[i][]=='N')Cn=l[i];
else if(s[i][]=='S')Cn=-l[i];
else if(s[i][]=='E')Ce=l[i];
else if(s[i][]=='W')Ce=-l[i];
if(x!=y){
fa[x]=y;
north[x]=north[b[i]]+Cn-north[a[i]];
east[x]=east[b[i]]+Ce-east[a[i]];
} while(q[pos].t==i&&pos<=k){
x=find(q[pos].a);
y=find(q[pos].b);
if(x!=y)ans[q[pos].num]=-;
else ans[q[pos].num]=abs(north[q[pos].a]-north[q[pos].b])+abs(east[q[pos].a]-east[q[pos].b]);
pos++;
}
}
for(int i=;i<=k;++i)printf("%d\n",ans[i]);
return ;
}
poj1984 带权并查集的更多相关文章
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- POJ1984:Navigation Nightmare(带权并查集)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7871 Accepted: 2 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- 【BZOJ-4690】Never Wait For Weights 带权并查集
4690: Never Wait for Weights Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 88 Solved: 41[Submit][ ...
- hdu3038(带权并查集)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- poj1611 带权并查集
题意:病毒蔓延,现在有 n 个人,其中 0 号被认为可能感染,然后给出多个社交圈,如果某个社交圈里有人被认为可能被感染,那么所有这个社交圈里的人都被认为可能被感染,现在问有多少人可能被感染. 带权并查 ...
随机推荐
- SharePoint 2013 开发——发布SharePoint应用程序
博客地址:http://blog.csdn.net/FoxDave 前几篇我们介绍了开发.部署和调试SharePoint应用程序的基础,本篇介绍更实用的操作,当我们开发一个SharePoint应用 ...
- 移动设备和SharePoint 2013 - 第1部分:概述
博客地址:http://blog.csdn.net/foxdave 原文地址 在该系列文章中,作者展示了SharePoint 2013最显著的新功能概观--对移动设备的支持. 该系列文章: 移动设备和 ...
- SharePoint开发 - Excel数据导入到SharePoint自定义列表(数据视图方式)
博客地址 http://blog.csdn.net/foxdave 本篇讲解一个有些新颖的SharePoint实例应用,给甲方做过项目的都有过体会,数据太多了,客户有Excel,要求实现批量导入. 效 ...
- java基础-006
37.JDBC JDBC是允许用户在不同数据库之间做选择的一个抽象层.JDBC允许开发者用JAVA写数据库引用程序,而不需要关心底层特定数据库的细节. 38.驱动(Driver) 在JDBC中的角色 ...
- fdisk分区
查看文件系统: # df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 20G 1.1G 18G 6% /tmpfs 1.9G 0 1.9 ...
- 关于wait和notify的用法
通常,多线程之间需要协调工作.例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程 downloadThread将该图片下载完毕.如果图片还没有下载完,d ...
- angularJs 自定义服务 provide 与 factory 的区别
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- VM虚拟机中Ubuntu无法连接网络
之前Ubuntu是可以上网的,但是今天打开后发现上不了网了,经过一番折腾,弄好了,记录下. 方案一:将网络连接设置为自定义NAT VM ->设置-> 硬件->网络适配器 这么已修改就 ...
- hdu 2085
PS:递推题.. a[n]=a[n-1]*3+2*b[n-1] b[n]=a[n-1]+b[n-1] 代码: #include "stdio.h" ]; ]; int main ...
- 自动获取UILabel的宽度高度
在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度 CGSize titleSize = [aSt ...