HDU 3038 How Many Answers Are Wrong(并查集)
2016-02-25 18:44
423 查看
Description
A有一个由n个数组成的序列,B问A一系列问题A回答,每次B询问区间[a,b]中所有数之和,A的可能说真话也可能说假话,此处认为如果未出现冲突则A说的是真话,共m次询问,问A说假话的次数
Input
第一行为两个整数n和m分别表示序列长度和询问次数,之后m行每行三个整数a,b,s表示[a,b]中所有数之和为s(1<=n<=200000,1<=m<=40000,1<=a<=b<=n,所有数据在int范围内)
Output
输出假话数量
Sample Input
10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1
Sample Output
1
Solution
将[a,b]中所有数之和为s看作是b比a-1大s,问题转化为简单并查集
Code
A有一个由n个数组成的序列,B问A一系列问题A回答,每次B询问区间[a,b]中所有数之和,A的可能说真话也可能说假话,此处认为如果未出现冲突则A说的是真话,共m次询问,问A说假话的次数
Input
第一行为两个整数n和m分别表示序列长度和询问次数,之后m行每行三个整数a,b,s表示[a,b]中所有数之和为s(1<=n<=200000,1<=m<=40000,1<=a<=b<=n,所有数据在int范围内)
Output
输出假话数量
Sample Input
10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1
Sample Output
1
Solution
将[a,b]中所有数之和为s看作是b比a-1大s,问题转化为简单并查集
Code
#include<cstdio> #include<iostream> #include<cstring> using namespace std; #define maxn 222222 int n,m,a,b,s,fa[maxn],sum[maxn]; void init(int n) { for(int i=1;i<=n;i++) { fa[i]=i; sum[i]=0; } } int find(int x) { if(fa[x]!=x) { int temp=fa[x]; fa[x]=find(temp); sum[x]+=sum[temp]; } return fa[x]; } int main() { while(~scanf("%d%d",&n,&m)) { init(n); int ans=0; for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&s); a--; int aa=find(a),bb=find(b); if(aa==bb) { if(sum[b]-sum[a]!=s)ans++; } else { fa[bb]=aa; sum[bb]=sum[a]-sum[b]+s; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- Linux下的sock_stream和sock_dgram
- 性能测试场景介绍
- CUDA之pycuda安装
- Delphi中JSon SuperObject 使用:数据集与JSON对象互转
- 网易财报暗藏玄机,不经意间已编织出电商大网
- day01—HTML网页编程基础
- cordova建立项目
- 用Delphi实现Windows的鼠标钩子函数
- iOS网络编程—NSURLSession的简单使用(iOS9)
- for 循环的流程图等价形式
- MySQL定义异常和异常处理方法
- 使用.pk8 和.pem签名生成.keystore 签名
- 工作笔记day02
- java基础知识map,list,char比较举例
- 啊速度擦上档次
- 用DELPHI的RTTI实现数据集的简单对象化
- 判断一个数是否是2^N次方
- Unity 5.x 导入教学Demo
- [BZOJ1968] [Ahoi2005]COMMON 约数研究
- 嵌入式jetty9启动标准webapp目录