题目链接: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. UNP学习笔记(第二章:传输层)

    本章的焦点是传输层,包括TCP.UDP和SCTP. 绝大多数客户/服务器网络应用使用TCP或UDP.SCTP是一个较新的协议. UDP是一个简单的.不可靠的数据报协议.而TCP是一个复杂.可靠的字节流 ...

  2. java 中 instanceof 和 isInstance区别

    两者的功能是等价的.区别: 1.instanceof 是一个操作符(类似new, ==等): 使用方法: if (ins instanceof String) { //logic } 2.isInst ...

  3. Ruby之Rspec的报错解决

    #enconding:utf-8 require 'selenium-webdriver' require 'rspec' describe "baidu main page" d ...

  4. 一款炫酷Loading动画--载入成功

    简单介绍 昨天在简书上看到一篇文章.介绍了一个载入动画的实现过程 一款Loading动画的实现思路(一) 仅仅可惜原动画是IOS上制作的.而看了一下.作者的实现思路比較复杂,于是趁着空暇写了一个And ...

  5. 【转载】IIS与asp.net管道

    阅读目录 asp.net是什么 HTTP协议 IIS与asp.net asp.net管道 参考资料 我们在基于asp.net开发web程序,基本上都是发布部署到安装了IIS的windows服务器上,然 ...

  6. hdu 1068 Girls and Boys 二分图的最大匹配

    题目链接:pid=1068">http://acm.hdu.edu.cn/showproblem.php? pid=1068 #include <iostream> #in ...

  7. 【nginx】关于Nginx的一些优化(突破十万并发)

    nginx指令中的优化(配置文件) worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数. worker_cpu_affinity 00000001 00 ...

  8. eolinker开源版接口管理

    eolinker开源版接口管理 想找一个API接口管理的软件,为了安全性和扩展性考虑,希望是开源的,而且可以在内网独立部署.网上翻找了资料,经过一份比对之后,最终采用eolinker.过去有使用过RA ...

  9. difference between VM, Docker and Vagrant区别

    VM:  VirtualBox, VMware Docker Vagrant using which you can create VMs or container. It interacts wit ...

  10. OpenCV 中的三大数据类型:CvMat 类型

    前言 本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法. 更多的矩阵处理函数还请参阅相关资料. CvMat 的类型定义 typedef struct CvMat { ...