题目链接: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. 改用MyAnalyzer的KMeans聚类算法

    <strong><span style="font-size:18px;">/*** * @author YangXin * @info 改用MyAnaly ...

  2. java 格式化json字符串

    须要下载:gson-2.2.4.jar

  3. WeakReference &&reference quene &&GC

    在了解WeakReference之前,先给出一段简单的代码: public class WeakReferenceTest {public static void main(String[] args ...

  4. 利用DataSet部分功能实现网站登录

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  5. the Determine in June

    今天是6月10号,周三. 自己做的CSDN博客端(仿小巫博客,ps:里边的框架和代码优化都是自己又一次用新框架做的或者自己又一次实现)也已经有三天了.进度还差非常多--- 结合了上次投简历的经验和期末 ...

  6. Java下HttpUnit和Jsoup的Http抓取

    简单记录下:搜集信息-分析问题-解决问题 关于html文档的操作现成库有: HttpUnit 很老了,不更了 http://www.httpunit.org/  20 May 2008 HttpUni ...

  7. Ubuntu下安装和编译ffmpeg

    参考:http://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu   1.安装依赖包 sudo apt-get update sudo apt-get -y ...

  8. keras----resnet-vgg-xception-inception

    来源: https://www.pyimagesearch.com/2017/03/20/imagenet-vggnet-resnet-inception-xception-keras/ classi ...

  9. 自制小工具大大加速MySQL SQL语句优化(附源码)

    引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又 ...

  10. 二、Silverlight中使用MVVM(二)——提高

    在第一篇文章中的示例中,我们已经简单的了解了应用MVVM模式的流程,我的本意是你已经了解了一点MVVM的概念,然后又没有一个较好的例子学习,可以跟着我一起学习MVVM模式,所以这个部分,都是没有理论知 ...