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

时间:2022-09-13 12:34:15

1202: [HNOI2005]狡猾的商人

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4127  Solved: 1981
[Submit][Status][Discuss]

Description

刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的。账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), 。当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元。所谓一段时间内的总收入,就是这段时间内每个月的收入额的总和。 刁姹的任务是秘密进行的,为了调查商人的账本,她只好跑到商人那里打工。她趁商人不在时去偷看账本,可是她无法将账本偷出来,每次偷看账本时她都只能看某段时间内账本上记录的收入情况,并且她只能记住这段时间内的总收入。 现在,刁姹总共偷看了m次账本,当然也就记住了m段时间内的总收入,你的任务是根据记住的这些信息来判断账本是不是假的。

Input

第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断。每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本。接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t。

Output

包含w行,每行是true或false,其中第i行为true当且仅当第i组数据,即第i个账本不是假的;第i行为false当且仅当第i组数据,即第i个账本是假的。

Sample Input

2
3 3
1 2 10
1 3 -5
3 3 -15
5 3
1 5 100
3 5 50
1 2 51

Sample Output

true
false
 
/*
若出现茅盾,一定是某个直接或间接出现的区间答案有了冲突
如果已知区间和[a,b],[b,c],那么就可以算出区间和[a,c]。
可以用带权并查集维护区间的答案,每个点维护它到根的区间和。
如果两点a,b在同一连通块内,则区间和为dis[b] - dis[a-1]。
根节点dis = 0.
更新时这个节点的权值更新为它到新根的区间和。
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 107 using namespace std;
int n,m,k,ans,cnt;
int f[N],dis[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int find(int x)
{
if(x!=f[x])
{
int t=find(f[x]);
dis[x]+=dis[f[x]];f[x]=t;
}return f[x];
} int main()
{
int T,x,y,z;T=read();
while(T--)
{
n=read();m=read();int flag=;
for(int i=;i<=n;i++) f[i]=i,dis[i]=;
for(int i=;i<=m;i++)
{
x=read();y=read();z=read();x--;
int r1=find(x),r2=find(y);
if(r1!=r2) f[r2]=r1,dis[r2]=dis[x]-dis[y]-z;
else if(dis[x]-dis[y]!=z) flag=;
}
if(flag) printf("false\n");else printf("true\n");
}
return ;
}
/*
差分约束,对于x1-x2=k,那么要同时满足x1-x2>=k和x1-x2<=k,即双向都建边,只是权值一正一负
然后跑SPFA判负环,如果无负环,则没有矛盾边,否则存在矛盾
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> #define N 2007 using namespace std;
int n,m,ans,cnt,opt;
int head[N],q[N],d[N],vis[N];
bool inq[N];
struct edge{
int u,v,net,w;
}e[N<<]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void add(int u,int v,int w)
{
e[++cnt].v=v;e[cnt].w=w;e[cnt].net=head[u];head[u]=cnt;
} void init()
{
memset(head,,sizeof head);
memset(vis,,sizeof vis);
memset(e,,sizeof e);
cnt=;opt=;
} void spfa(int s)
{
queue<int>que;memset(d,/,sizeof d);
memset(inq,,sizeof inq);
while(!que.empty()) que.pop();
inq[s]=;d[s]=;que.push(s);
while(!que.empty())
{
int u=que.front();que.pop();inq[u]=;vis[u]++;
if(vis[u]>n){opt=;return;}
for(int i=head[u];i;i=e[i].net)
{
int v=e[i].v;
if(d[v]>d[u]+e[i].w)
{
d[v]=d[u]+e[i].w;
if(!inq[v]) inq[v]=,que.push(v);
}
}
}
} int main()
{
int T,x,y,z;T=read();
while(T--)
{
n=read();m=read();init();
for(int i=;i<=m;i++)
{
x=read();y=read();z=read();
add(x-,y,-z);add(y,x-,z);
}
for(int i=;i<=n;i++)
{
if(!vis[i])
{
spfa(i);
if(opt) break;
}
}
if(opt)printf("false\n");
else printf("true\n");
}
return ;
}

bzoj1202: [HNOI2005]狡猾的商人(并查集 差分约束)的更多相关文章

  1. BZOJ1202 &lbrack;HNOI2005&rsqb;狡猾的商人 并查集维护前缀和

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

  2. bzoj 1202&colon; &lbrack;HNOI2005&rsqb;狡猾的商人 并查集好题

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

  3. B1202 &lbrack;HNOI2005&rsqb;狡猾的商人 并查集

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

  4. &lbrack;BZOJ1202&rsqb;&lbrack;HNOI2005&rsqb;狡猾的商人

    [BZOJ1202][HNOI2005]狡猾的商人 试题描述 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i= ...

  5. BZOJ1202 &lbrack;HNOI2005&rsqb;狡猾的商人 【并查集】

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4180  Solved: 2015 [Submit][S ...

  6. BZOJ-1202 狡猾的商人 并查集&plus;前缀和

    我记得这个题,上次之前做的时候没改完,撂下了,今天突然想改发现,woc肿么A 了= =看来是我记错了.. 1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec Memory ...

  7. bzoj1202&colon; &lbrack;HNOI2005&rsqb;狡猾的商人(差分约束)

    1202: [HNOI2005]狡猾的商人 题目:传送门 题解: 据说是带权并查集!蒟蒻不会啊!!! 可是听说lxj大佬用差分约束A了,于是开始一通乱搞. 设s[i]为前i个月的总收益,那么很容易就可 ...

  8. BZOJ1202&colon; &lbrack;HNOI2005&rsqb;狡猾的商人&lpar;带权并查集&rpar;

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4577  Solved: 2249[Submit][Status][Discuss] Descript ...

  9. BZOJ1202 &lbrack;HNOI2005&rsqb;狡猾的商人 spfa

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1202 题意概括 有一个数列,共n个数字. 告诉你m个区间和,问是否矛盾. 数据组数<=100 ...

随机推荐

  1. js原生跨域--用script标签实现

    刚刚从培训班学习完,总想写一下东西,自从进入了这个院子,每次出现问题,总是能找到一些答案,给我一些帮助. 作为新手,就写一下简单的吧,院子里面有很多大牛, 说句实话,他们的很多代码我都看不懂. 我就写 ...

  2. 黑马程序员——C语言基础语法 关键字 标识符 注释 数据及数据类型

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)C语言简单介绍 (1)C语言程序是由函数组成的任何C语言程序都是由一 ...

  3. Android——获取网络图片

    布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  4. Cocostudio学习笔记(4) LoadingBar&plus; TextField

    这同时录制两个控件的使用方法:LoadingBar和 TextField. -------------------------------------------------------------- ...

  5. js:如何在循环异步请求的每次返回中添加想要的值

    先看一个场景 var arr = ["a","b","c"]; for (var i in arr) {         $.get(&qu ...

  6. MYSQL创建数据库时候直接指定编码和排序规则

    安装我 在网上搜索的结果执行 代码: sudo gedit /etc/mysql/my.cnf 设置了默认编码为 UTF8 代码: [client]port            = 3306sock ...

  7. Java利用自定义注解、反射实现简单BaseDao

    在常见的ORM框架中,大都提供了使用注解方式来实现entity与数据库的映射,这里简单地使用自定义注解与反射来生成可执行的sql语句. 这是整体的目录结构,本来是为复习注解建立的项目^.^ 好的,首先 ...

  8. Java基础学习笔记九 Java基础语法之this和super

    构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当 ...

  9. 【Angular专题】——(1)Angular,孤傲的变革者

    目录 一. 漫谈Angular 二. 如果你还在使用Angularjs 三. 我计划这样学习Angular技术栈 一. 漫谈Angular Angular,来自Google的前端SPA框架,与Reac ...

  10. Css - 三大特性

    css - 三大特性 1.层叠性 如果通过两个相同选择器设置了同一个元素的某个相同的css属性,按照css相同属性的出现顺序,后面的样式会覆盖前面的样式 2.继承性 祖先元素的关于文本的样式会遗传给后 ...