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 [HNOI2005]狡猾的商人 并查集维护前缀和

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

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

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

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

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

  4. [BZOJ1202][HNOI2005]狡猾的商人

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

  5. BZOJ1202 [HNOI2005]狡猾的商人 【并查集】

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

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

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

  7. bzoj1202: [HNOI2005]狡猾的商人(差分约束)

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

  8. BZOJ1202: [HNOI2005]狡猾的商人(带权并查集)

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

  9. BZOJ1202 [HNOI2005]狡猾的商人 spfa

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

随机推荐

  1. Java语言编写TPL语言词法分析器

    程序实现原理: 将TXT文本中的数据读出,并按照其类别的不同,将关键字.数字以及运算符识别出来. 一.词法分析实验步骤 1. 熟悉TPL语言 2. 编写TPL语言程序,至少3个,一个简单,一个复杂的( ...

  2. HDU 4945 (dp+组合数学)

    2048 Problem Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to ...

  3. sql 日期问题从周转换到日期

    alter procedure p_date@year int=2005,    --年份@week int=33,    --第几周@firstday datetime =null output,  ...

  4. Thinkphp5.0 视图view取值

    Thinkphp5.0 视图view取值 <!-- 获取控制器传递的变量 --> <li>{$age}</li> <!-- 获取服务器的信息 --> & ...

  5. 牛客网 中南林业科技大学第十一届程序设计大赛J题 二分+线段树

    https://www.nowcoder.com/acm/contest/124#question 题意  找第一个不小于K的数的下标,然后对它前一个数加一 解析   我们可以维护一个最大值数组  1 ...

  6. ETL增量单表同步简述_根据timestamp增量

    ETL增量单表同步简述 1. 实现需求 当原数据库的表有新增.更新.删除操作时,将改动数据同步到目标库对应的数据表. 2. 设计思路 设计总体流程图如下: 步骤简单说明: 1.设置job的执行属性,如 ...

  7. [转]一个完整的Installshield安装程序实例

    @import url("http://files.cnblogs.com/files/go-jzg/vs.css"); --> Installshield安装程序实例—基本 ...

  8. 基于Token的身份验证——JWT(转)

    本文转自:http://www.cnblogs.com/zjutzz/p/5790180.html 感谢作者 初次了解JWT,很基础,高手勿喷.基于Token的身份验证用来替代传统的cookie+se ...

  9. eclipse常用使用指南

    1.eclipse添加new/删除/一个tomcat. 步骤:window->preference->server->runtime environment.remove掉,再重新n ...

  10. java.lang.IllegalArgumentException: sheetName &#39;&#39; is invalid

    1.错误描写叙述 java.lang.IllegalArgumentException: sheetName '' is invalid - character count MUST be great ...