HDU 3038 How Many Answers Are Wrong 【神奇并查集】
2017-03-30 16:21
489 查看
点击打开链接
题意: 给你n 表示有个长度为n的序列。
然后有m个计算,a到b 和为s
然后找出其中错误的个数。
题解:
很不好想这个, 我开始题都没读懂,更别说想到并查集。
那知道了并查集怎么写呢,
首先,已知 a,b,c.的关系,abc 之间的关系都能找到,加上d abcd之间的关系也都能找出,
那么。每给出一个关系,先比较是不是共同祖先, 如果是,那就可以直接比较是否错误,
如果不是,合并即可。
用sum记录合并后的区间和。
#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#define ll long long
const int maxn=2e5+100;
int n,m,a,b,s;
int fa[maxn],sum[maxn];
int Find(int x){
if(fa[x]==x) return x;
int t=fa[x];
fa[x]=Find(fa[x]);
sum[x]+=sum[t];
return fa[x];
}
void Union(int x,int y,int a,int b,int s){
if(x>y){
fa[y]=x;
sum[y]=sum[a]-sum[b]-s;
}else{
fa[x]=y;
sum[x]=sum[b]-sum[a]+s;
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
int wa=0;
for(int i=0;i<=n;++i) fa[i]=i;
memset(sum,0,sizeof(sum));
while(m--){
scanf("%d %d %d",&a,&b,&s);
a--;
int t1=Find(a),t2=Find(b);
if(t1==t2&&sum[a]!=sum[b]+s) wa++;
else if(t1!=t2){
Union(t1,t2,a,b,s);
}
}
printf("%d\n",wa);
}
return 0;
}
题意: 给你n 表示有个长度为n的序列。
然后有m个计算,a到b 和为s
然后找出其中错误的个数。
题解:
很不好想这个, 我开始题都没读懂,更别说想到并查集。
那知道了并查集怎么写呢,
首先,已知 a,b,c.的关系,abc 之间的关系都能找到,加上d abcd之间的关系也都能找出,
那么。每给出一个关系,先比较是不是共同祖先, 如果是,那就可以直接比较是否错误,
如果不是,合并即可。
用sum记录合并后的区间和。
#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#define ll long long
const int maxn=2e5+100;
int n,m,a,b,s;
int fa[maxn],sum[maxn];
int Find(int x){
if(fa[x]==x) return x;
int t=fa[x];
fa[x]=Find(fa[x]);
sum[x]+=sum[t];
return fa[x];
}
void Union(int x,int y,int a,int b,int s){
if(x>y){
fa[y]=x;
sum[y]=sum[a]-sum[b]-s;
}else{
fa[x]=y;
sum[x]=sum[b]-sum[a]+s;
}
}
int main(){
while(~scanf("%d %d",&n,&m)){
int wa=0;
for(int i=0;i<=n;++i) fa[i]=i;
memset(sum,0,sizeof(sum));
while(m--){
scanf("%d %d %d",&a,&b,&s);
a--;
int t1=Find(a),t2=Find(b);
if(t1==t2&&sum[a]!=sum[b]+s) wa++;
else if(t1!=t2){
Union(t1,t2,a,b,s);
}
}
printf("%d\n",wa);
}
return 0;
}
相关文章推荐
- 杭电hdu 3038 how many answers are wrong 并查集求解
- hdu 3038 How Many Answers Are Wrong 带权并查集
- hdu 3038 How Many Answers Are Wrong (带权并查集)
- hdu 3038 - How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong【带权并查集】
- HDU 3038 How Many Answers Are Wrong (带权并查集+区间判断)
- HDU 3038 How Many Answers Are Wrong (并查集)
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集+树的性质)
- hdu 3038 How Many Answers Are Wrong(带权并查集+树的性质)
- hdu 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong 带权并查集
- hdu 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU-3038 How Many Answers Are Wrong 带权并查集
- HDU 3038 How Many Answers Are Wrong (并查集路径压缩)
- HDU 3038 How Many Answers Are Wrong - 并查集
- hdu 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩