题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1202

题意:

  有一个账本,记录了n个月的盈亏。

  每个月的数值:正为盈,负为亏。

  你知道m个这个账本的区间和[x[i],y[i]]。

  问你这个账本是真是假。

题解:

  如果已知区间和[a,b],[b,c],那么就可以算出区间和[a,c]。

  而唯一判断账本真假的方法,就是看有没有某个给定的区间和A[a,c]与推出来的区间和B[a,c]不相等。如果不相等,账本为假。

  我们常用前缀和来处理区间和。

  但此题仅给出点与点之间的差值,因此要用并查集维护:

    某一连通块内各节点到根节点的差值dis[i]。

    如果两点a,b在同一连通块内,则区间和为dis[b] - dis[a-1]。

  根节点dis = 0.

  每次要用到某个dis[x]时,要在之前执行一遍find(x),以更新x的真正父亲,也顺便将dis[x]改为了它与真父亲的差值。

  让px认py作爹时,要更新dis[px] = px到py的差值 = dis[y]-w-dis[x].

  特别要注意前缀和方向:

    “从根到节点的前缀和方向”与“认爹箭头方向”相反。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 105 using namespace std; int n,m,t;
int dis[MAX_N];
int par[MAX_N];
bool flag; void init_union_find()
{
memset(dis,,sizeof(dis));
for(int i=;i<=n;i++)
{
par[i]=i;
}
} int find(int x)
{
if(par[x]==x) return x;
int t=find(par[x]);
dis[x]+=dis[par[x]];
return par[x]=t;
} void unite(int x,int y,int w)
{
int px=find(x);
int py=find(y);
if(px==py) return;
dis[px]=dis[y]-w-dis[x];
par[px]=py;
} bool same(int x,int y)
{
return find(x)==find(y);
} void work()
{
cin>>n>>m;
int x,y,w;
flag=true;
init_union_find();
for(int i=;i<m;i++)
{
cin>>x>>y>>w;
if(same(x-,y))
{
if(dis[y]-dis[x-]!=w)
{
flag=false;
return;
}
}
else unite(x-,y,w);
}
} void print()
{
if(flag) cout<<"true"<<endl;
else cout<<"false"<<endl;
} int main()
{
cin>>t;
while(t--)
{
work();
print();
}
}

BZOJ 1202 [HNOI2005]狡猾的商人:并查集(维护距离)的更多相关文章

  1. bzoj 1202: [HNOI2005]狡猾的商人 并查集好题

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Sta ...

  2. BZOJ1202 [HNOI2005]狡猾的商人 并查集维护前缀和

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1935  Solved: 936[Submit][Stat ...

  3. BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

    好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SP ...

  4. bzoj1202: [HNOI2005]狡猾的商人(并查集 差分约束)

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4127  Solved: 1981[Submit][Sta ...

  5. BZOJ 1202 [HNOI2005]狡猾的商人(并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1202 [题目大意] 给出一些区间和的数值,问是否存在矛盾 [题解] 用并查集维护前缀和 ...

  6. BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]

    题意: 给出m个区间和,询问是否有区间和和之前给出的矛盾 NOIp之前做过hdu3038..... 带权并查集维护到根的权值和,向左合并 #include <iostream> #incl ...

  7. BZOJ——1202: [HNOI2005]狡猾的商人

    http://www.lydsy.com/JudgeOnline/problem.php?id=1202 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: ...

  8. bzoj 1202: [HNOI2005]狡猾的商人

    我居然用暴力跑过去了... 思路:两个区间合成一个新的区间才会产生冲突, 我们用并查集维护前缀和, 0 - n 个节点分别表示sum[ 0 ] - sum[ n ], d[ i ] 表示 前缀i 和它 ...

  9. B1202 [HNOI2005]狡猾的商人 并查集

    其实就是并查集的题.维护一个前缀和,然后用并查集维护前缀和,每次判断是否合理就行了. 题干: Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了 ...

随机推荐

  1. binary-tree-zigzag-level-order-traversal——二叉树分层输出

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  2. Hessian原理与程序设计

     Hessian是比較经常使用的binary-rpc.性能较高,适合互联网应用.主要使用在普通的webservice 方法调用.交互数据较小的场景中.hessian的数据交互基于http协议,通常he ...

  3. Java 命名规则

    http://lpacec.iteye.com/blog/25180包名:包名是全小写的名词,中间可以由点分隔开,例如:java.awt.event; 类名:首字母大写,通常由多个单词合成一个类名,要 ...

  4. iTunes备份注意

    记住:     如果你有重要的信息在iTunes中无备份的话.那么开始不要同步了. 退出时,最好备份后在退出.

  5. (九)jQuery中的动画(载)

    原文链接:http://blog.csdn.net/zfy865628361/article/details/50358367 首先,用jQuery做动画效果要求在标准模式下,否则可能会引起动画抖动. ...

  6. winform 下载文件显示进度和百分比

    /// <summary> /// 下载完成 /// </summary> private void DownloadFileCompleted() { IsComlate = ...

  7. 封装CLLocationManager定位获取经纬度

    创建调用方法,在.h文件里 #import <Foundation/Foundation.h> @interface RMMapLocation : NSObject { void (^s ...

  8. ReactiveCocoa入门教程——第一部分【转载】

    作为一个iOS开发者,你写的每一行代码几乎都是在响应某个事件,例如按钮的点击,收到网络消息,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理 ...

  9. JAVA中两个Set比较找出交集、差集、并集

    当做到某些功能的时候,使用Set能够快速方便地将需要的类型以集合类型保存在一个变量中,Set是最简单的一种集合,集合中的对象不按特定的方式排序,并且没有重复对象. //两个Set比较找出交集.差集.并 ...

  10. Portal实现原理

    https://blog.csdn.net/sukyle/article/details/6456930