http://poj.org/problem?id=1984 (题目链接)

题意

  给出一棵树,这棵树是以平面直角坐标系为基准建立的,也就是每个节点最多只有上下左右4条边。现在动态建树,同时询问两点间的曼哈顿距离

Solution

  一开始没看懂题,当做图写了个SPFA。。后来发现是树于是删掉重新写了个DFS。。最后又发现要动态建树。。尼玛。。又重新写了个带全并查集。。

  注意询问并不保证时间是升序的,要按照给定询问顺序输出。

代码

// poj1984
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define MOD 100000000
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=100010;
struct edge {int u,v,w,t;}e[maxn];
struct data {int u,v,id,d;}t[maxn];
int n,m,q,X[maxn],Y[maxn],ans[maxn],fa[maxn]; bool cmp(data a,data b) {
return a.id<b.id;
}
int find(int x) {
if (x==fa[x]) return x;
int f=find(fa[x]);
X[x]+=X[fa[x]];
Y[x]+=Y[fa[x]];
return fa[x]=f;
}
int main() {
scanf("%d%d",&n,&m);
char ch;
for (int x,u,v,w,i=1;i<=m;i++) {
scanf("%d%d%d %c",&u,&v,&w,&ch);
if (ch=='N') x=0;else if (ch=='S') x=1;else if (ch=='W') x=2;else x=3;
e[i]=(edge){u,v,w,x};
}
scanf("%d",&q);
for (int i=1;i<=q;i++) scanf("%d%d%d",&t[i].u,&t[i].v,&t[i].id),t[i].d=i;
sort(t+1,t+1+q,cmp);
for (int i=1;i<=n;i++) fa[i]=i;
int pp=1;
for (int u,v,w,ty,i=1;i<=m;i++) {
u=e[i].u,v=e[i].v,w=e[i].w,ty=e[i].t;
int r1=find(u),r2=find(v);
fa[r1]=v;
if (ty==0) X[r1]-=X[u],Y[r1]=e[i].w-Y[u];
else if (ty==1) X[r1]-=X[u],Y[r1]=-e[i].w-Y[u];
else if (ty==2) X[r1]=-e[i].w-X[u],Y[r1]-=Y[u];
else X[r1]=e[i].w-X[u],Y[r1]-=Y[u];
while (t[pp].id==i && pp<=q) {
if (find(t[pp].u)!=find(t[pp].v)) ans[t[pp].d]=-1;
else ans[t[pp].d]=abs(X[t[pp].u]-X[t[pp].v])+abs(Y[t[pp].u]-Y[t[pp].v]);
pp++;
}
if (pp==q+1) break;
}
for (int i=1;i<=q;i++) printf("%d\n",ans[i]);
return 0;
}

  

最新文章

  1. Oracle基础维护01-常用管理命令总结
  2. android布局属性详解
  3. mod_PHP&amp;fastcgi
  4. 打字机游戏Ⅱ之手速pk
  5. MooseFs-分布式文件系统系列(二)之安装总结
  6. 获取Python安装目录
  7. SQL Server 2008 游标使用实例
  8. Qt Assistant 的配置文件qhp---&gt;qch 和qhcp---&gt;qhc详解与生成
  9. DataTable转化为List
  10. D10
  11. [ Java面试题 ]数据库篇
  12. 网络流 P3358 最长k可重区间集问题
  13. Oracle视图 create View
  14. CSU 2005 Nearest Maintenance Point(最短路+bitset)
  15. .gitignore设置
  16. 如何解决#1045 - Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)问题
  17. python2和python3的不同
  18. 采样方法(Sampling Methods)
  19. Swift_ScrollView _ API详解
  20. PIE SDK矢量数据的修改

热门文章

  1. PHP代码20个实用技巧(转)
  2. DPABI advanced edition 文件夹组织形式
  3. DEDECMS之十 修改织梦链和文章的默认来源及作者
  4. 嵌入支付宝SDK,出现“LaunchServices: ERROR: There is no registered handler for URL scheme alipay”错误
  5. 塔吊力矩限制器,塔吊黑匣子,塔吊电脑,tower crane
  6. 我在 CSDN 的小窝
  7. opencv2-新特性及Mat
  8. 天龙客户端的GameManager
  9. hdu1754 I hate it线段树模板 区间最值查询
  10. hdu5481 Desiderium