HDU 3038 How Many Answers Are Wrong(种类并查集)

题目链接

食物链类似的题,主要是在于转化,a-b的和为s,转换为b比a-1大s。然后并查集存 此节点到根的差。

假如x的根为a,y的根为b:

b - y = rank[y]

a - x = rank[x]

y - x = s

可以推出b - a = rank[y] - rank[x] + s;

并查集 延迟更新什么的,都忘了啊。

还有这题,如果是x--的话,记得更新0的根。

#include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int o[200001];
int rank[200001];
int find(int x)
{
if(x == o[x]) return x;
int t = find(o[x]);
rank[x] = rank[o[x]] + rank[x];
return o[x] = t;
}
int main()
{
int n,m,i,a,b,s,ans,x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i = 0;i <= n;i ++)
{
o[i] = i;
rank[i] = 0;
}
ans = 0;
for(i = 0;i < m;i ++)
{
scanf("%d%d%d",&x,&y,&s);
x -- ;
a = find(x);
b = find(y);
if(a != b)
{
o[a] = b;
rank[a] = rank[y] - rank[x] + s;
}
else
{
if(rank[x] != rank[y] + s)
ans ++;
}
}
printf("%d\n",ans);
}
return 0;
}

HDU 3038 How Many Answers Are Wrong(种类并查集),布布扣,bubuko.com

时间: 2024-10-18 06:43:06

HDU 3038 How Many Answers Are Wrong(种类并查集)的相关文章

hdu 3038 How Many Answers Are Wrong(并查集)

题意: N和M.有N个数. M个回答:ai, bi, si.代表:sum(ai...bi)=si.如果这个回答和之前的冲突,则这个回答是假的. 问:M个回答中有几个是错误的. 思路: 如果知道sum(ai...bi)=si.假设下一个是sum(ai,ci)=sj.则sum(ai,ci)肯定也知道了.这很符合并查集的结构. *:画个图. 代码: int n,m; int fa[200005]; int sum[200005]; int findFa(int x){ if(fa[x]==x){ re

HDU 1829 A Bug&#39;s Life (种类并查集)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1829 A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19429    Accepted Submission(s): 6206 Problem Description Background Professor H

HDU 5285 wyh2000 and pupil(dfs或种类并查集)

wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 755    Accepted Submission(s): 251 Problem Description Young theoretical computer scientist wyh2000 is teaching his pupils. Wy

hdu3038 How Many Answers Are Wrong 种类并查集

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int n, m; 7 const int maxn = 200005; 8 int fa[maxn]; 9 int sum[maxn]; 10 11 int Find(int x){ 12 if (x == fa[x]) 13 return x; 14 else{ 15 int t = f

hdu 3038 How Many Answers Are Wrong(种类并查集)

了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了. 现在回过头来看,又看了一遍. 题意—— 输入—— 给出多组测试数据. 每组数据第一行包含两个整数n, m.n表示共有1——n这么多个数,m表示m组提示. 接下来m行,每行包含三个整数a, b, val.表示从a到b这几个数的和为val. 这几组数有可能有冲突,问一共有多少组有冲突的数据. 输出—

HDU - 3038 How Many Answers Are Wrong (带权并查集)

题意:n个数,m次询问,每次问区间a到b之间的和为s,问有几次冲突 思路:带权并查集的应用,[a, b]和为s,所以a-1与b就可以确定一次关系,通过计算与根的距离可以判断出询问的正确性 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 200010; int f[MAXN],a

HDU 3038 How Many Answers Are Wrong (带权并查集+区间判断)

题意:给你长度为n的区间,m个询问:a,b,c,问这m个问题有多少个是错误的(矛盾). 10 5 1 10 100 7 10 28 1 3 32 4 6 41 6 6 1 由6->6=1,  4->6=41 知4->5=40; 同理 由1->10=100,7->10=28 知1->7=72; 又由1->3=32,4-6=41 知1->7=73,与上面矛盾: 所以答案为1: #include<cstdio> #include<stdlib.h

HDU 1829 &amp;&amp; POJ 2492 A Bug&#39;s Life(种类并查集)

题目地址:HDU 1829     POJ 2492 这个题可以用两种方法做,第一眼看完题是觉得用dfs染色判断二分图.然后又写的刚学的种类并查集.原来并查集可以这样用,真是神奇.. dfs染色代码: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #incl

hdu 1829 A Bug&#39;s Life (基础种类并查集)

先说说种类并查集吧. 种类并查集是并查集的一种.但是,种类并查集中的数据是分若干类的.具体属于哪一类,有多少类,都要视具体情况而定.当然属于哪一类,要再开一个数组来储存.所以,种类并查集一般有两个数组,一个存并查集内的父子关系,一个存各个节点所属的种类关系. 以这道题为例(题意在后面,如果没有读题,可以先看完题在来看这部分)—— 这道题很明显,将bug分成两类,一公一母.但是实际上我们并不关心它是公的还是母的,只关心它们之间是同性还是异性.所以,我们可以设与并查集的根节点同性的为0,反之为1.所