[HNOI 2005]狡猾的商人

时间:2021-06-10 00:39:11

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

题解

解法一 差分约束

首先,我们令$sum_i$表示前$i-1$个月的收入和。

对于输入的三元组$(u,v,c)$,显然就是$sum_{v+1}-sum_u == c$,等价于$sum_{v+1}-sum_u >= c$ && $sum_{v+1}-sum_u <= c$,就变成的差分约束的模板。

等于说我们就加上$(u,v+1,c)$和$(v+1,u,-c)$这两条边,判断这个差分约束系统是否有解。

 //It is made by Awson on 2017.10.15
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
using namespace std;
const int N = ;
const int M = ; int n, m;
struct tt {
int to, next, cost;
}edge[(M<<)+];
int path[N+], top;
bool vis[N+];
int dist[N+]; bool dfs_SPFA(int u) {
vis[u] = ;
for (int i = path[u]; i; i = edge[i].next)
if (dist[edge[i].to] > dist[u]+edge[i].cost) {
if (vis[edge[i].to]) {vis[u] = ; return true;}
dist[edge[i].to] = dist[u]+edge[i].cost;
if (dfs_SPFA(edge[i].to)) {vis[u] = ; return true;}
}
vis[u] = ;
return false;
}
void add(int u, int v, int c) {
edge[++top].to = v;
edge[top].next = path[u];
edge[top].cost = c;
path[u] = top;
}
void work() {
memset(dist, , sizeof(dist));
memset(path, , sizeof(path)); top = ;
scanf("%d%d", &n, &m); n++;
for (int u, v, c, i = ; i <= m; i++) {
scanf("%d%d%d", &u, &v, &c);
add(u, v+, c); add(v+, u, -c);
}
for (int i = ; i <= n; i++) if (dfs_SPFA(i)) {
printf("false\n"); return;
}
printf("true\n");
}
int main() {
int t; scanf("%d", &t);
while (t--) work();
return ;
}

差分约束

解法二 带权并查集

我们令$cost_u$表示$u$这个节点到根节点的花销。

对于输入$(u,v,c)$,令$p = root_u$,$q = root_v$。

如果$p != q$即$u$,$v$不在一棵树上,那么我们将$father_p ← q$,此时$cost[p] = cost[v]-c-cost[u]$;

若$p == q$即在同一棵树树上,那么我们只要判断$cost[v]-cost[u] == c$即可。若是,则满足,否则为$false$。

 //It is made by Awson on 2017.10.15
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
using namespace std;
const int N = ;
const int M = ; int n, m;
#define set SET
#define cost COST
int set[N+], cost[N+];
int find_father(int r) {
if (set[r]) {
int t = find_father(set[r]);
cost[r] += cost[set[r]]; set[r] = t;
return t;
}
return r;
} void work() {
memset(set, , sizeof(set));
memset(cost, , sizeof(cost));
scanf("%d%d", &n, &m);
while (m--) {
int u, v, c;
scanf("%d%d%d", &u, &v, &c); v++;
int p = find_father(u);
int q = find_father(v);
if (p != q) {
set[p] = q;
cost[p] = cost[v]-c-cost[u];
}else {
if (cost[v]-cost[u] != c) {
while (m--) scanf("%d%d%d", &u, &v, &c);
printf("false\n"); return;
}
}
}
printf("true\n");
}
int main() {
int t; scanf("%d", &t);
while (t--) work();
return ;
}

带权并查集

[HNOI 2005]狡猾的商人的更多相关文章

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

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

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

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

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

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

  4. BZOJ&lowbar;1202&lowbar;狡猾的商人&lowbar;&lpar;并查集&rpar;

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1202 n 个月的账单,共 m 组数据,每一组数据包括 x , y , t ,表示从 x 月到 ...

  5. BZOJ 1202&colon; &lbrack;HNOI2005&rsqb;狡猾的商人&lpar; 差分约束 &rpar;

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

  6. 1202&colon; &lbrack;HNOI2005&rsqb;狡猾的商人

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

  7. &lbrack;HNOI2005&rsqb;狡猾的商人 ,神奇做法——贪心

    洛谷P2294 [HNOI2005]狡猾的商人 ,神奇做法--贪心 看到大牛都是写的差分约束或带权并查集,本蒟蒻都不太会(还是用差分约束过了的QAQ),但是想出一种贪心的策略,运用神奇的优先队列实现. ...

  8. &lbrack;luogu P2294&rsqb; &lbrack;HNOI2005&rsqb;狡猾的商人

    [luogu P2294] [HNOI2005]狡猾的商人 题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据, ...

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

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

随机推荐

  1. Apache与Nginx对客户端请求的处理机制对比

    Apache与Nginx对客户端请求的处理机制对比 模块 大致为四个模块,核心模块.HTTP模块.邮件模块,以及第三方模块 核心模块主要包含两类功能的支持,一类是主体功能,包括进程管理,权限管理,错误 ...

  2. 查看SQL语句在SQL Server上的执行时间

    set statistics profile onset statistics io onset statistics time ongo--begin <这里写上你的语句...>  se ...

  3. wpf window set window的owner

        [DllImport("user32.dll")]   public static extern IntPtr GetAncestor(IntPtr hWnd, int f ...

  4. DP最长递增字符串

    对于最简单DP问题,比如7 9 1 10 3中最长的递增字符串就是7 9 10,所以长度是3. 对于这个问题,就是从第二个开始,让后面的每一个字符都假设作为咱们要找的最长的字符串的最后一个字符,然后从 ...

  5. 【python爬虫】根据查询词爬取网站返回结果

    最近在做语义方面的问题,需要反义词.就在网上找反义词大全之类的,但是大多不全,没有我想要的.然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html ...

  6. 常用数据与VARIANT之间的转换---从网上整理

    //头文件 1 #pragma once class VariantConvert { public: VariantConvert(void); ~VariantConvert(void); pub ...

  7. andorid简易定位

    权限: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></use ...

  8. c语言,中缀表达式转后缀表达式并计算

    //c语言中缀表达式计算 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  9. 区分TCP包的顺序

    确认TCP包的顺序: 使用抓包工具抓包之后,通常按照时间先后排序的,而不是数据的内容逻辑先后.查找内容的先后的关键在于查看TCP中的Sequence number和Acknowledgment num ...

  10. 神经网络 之 DNN&lpar;深度神经网络&rpar; 介绍

    CNN(卷积神经网络).RNN(循环神经网络).DNN(深度神经网络) CNN 专门解决图像问题的,可用把它看作特征提取层,放在输入层上,最后用MLP 做分类. RNN 专门解决时间序列问题的,用来提 ...