时间:2016-03-16 16:12:28 星期三
题目编号:[2016-03-16][HDU][3038][How Many Answers Are Wrong]
题目大意:
给定n个数字,给出若干个区间的和,问这些和有多少个是错误的,如果未知,那么就默认是对的,如果前面已知,就判断是否正确
分析:求出那些数据是已经给出的,已经给出的就可以求
方法:并查集更新已经出现的区间,集合内的元素为区间内的点,父节点表示区间的左端点,权值表示到父节点到当前点这段区间元素的和
解题过程遇到问题:多组数据!!!!
#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <cctype>#include <string>#include <cstring>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;typedef long long LL;#define CLR(x,y) memset((x),(y),sizeof((x)))#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))#define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x))const int maxn = 200000 + 100;int fa[maxn],sum[maxn];void ini(int n){ CLR(sum,0); for(int i = 0; i <= n;++i){ fa[i] = i; }}int fnd(int x){ if(x == fa[x]) return x; int fax = fa[x]; fa[x] = fnd(fa[x]); sum[x] += sum[fax]; return fa[x]; }int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,m; while(~scanf("%d%d",&n,&m)){ int u,v,tsum,ans = 0; ini(n); FOR(i,0,m){ scanf("%d%d%d",&u,&v,&tsum); int t1,t2; --u; t1 = fnd(u); t2 = fnd(v); if(t1 == t2){ ans += (sum[v] - sum[u] != tsum); }else { fa[t2] = t1; sum[t2] = tsum + sum[u] - sum[v]; } } printf("%d\n",ans); } return 0;}