有多少答案是错误的(维护持续区间,带权并查集)

有多少答案是错误的 HDU - 3038
TT和FF是……朋友。呃…非常非常好的朋友-________-b

FF是个坏孩子,他总是拉着TT跟他玩下面的游戏。这是一个非常单调的游戏。首先,TT 应该写下一个整数序列-_-!!(无聊)。

然后,FF 可以从中选择一个连续的子序列(例如从第三个到第五个整数的子序列)。之后FF会问TT他选择的子序列的总和是多少。接下来,TT来回答FF的问题。然后,FF 可以重做这个过程。最后,FF 必须计算出整个整数序列。

无聊无聊很无聊的游戏!!!TT根本不想玩FF。为了惩罚FF,她经常故意告诉FF错误的答案。

坏孩子不是傻子。FF 检测到某些答案不兼容。当然,这些矛盾使得计算序列变得困难。

然而,TT是一个善良可爱的女孩。她不忍心对FF硬。为了节省时间,她保证如果确实没有逻辑错误,答案是正确的。

更重要的是,如果FF发现一个答案是错误的,他在判断下一个答案时会忽略它。

但是问题太多了,可怜的FF一时也分不清现在的答案是对是错。所以他决定写一个程序来帮助他解决这个问题。该计划将收到 FF 的一系列问题以及 FF 从 TT 收到的答案。这个程序的目的是找出有多少答案是错误的。只有忽略错误的答案,FF 才能算出整个整数序列。可怜的FF没时间做这个工作。而现在他在寻求你的帮助(为什么要自找麻烦~坏孩子)
输入
第 1 行:两个整数,N 和 M(1 <= N <= 200000,1 <= M <= 40000)。意思是TT写了N个整数,FF问了她M个问题。

第 2…M+1 行:第 i+1 行包含三个整数:Ai、Bi 和 Si。表示 TT 回答 FF 从 Ai 到 Bi 的总和是 Si。保证 0 < Ai <= Bi <= N。

您可以假设子序列的任何总和都适合 32 位整数。
输出
带有整数的单行表示有多少答案是错误的。
样本输入
10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1
样本输出
1
思路:带权并查集,很多时候给定【x,y】区间我们要化为(x- -,y】区间。如果给定x,y没有在同一块就uino,否则查询va【x】-va【y】是否满足给定的w。
Find
Find 1到3的距离为2,带权并查集比普通并查集多一个va数组,保存值,本题的va【x】就用来保存x到跟节点的值,如1
到3的值为2,在Find路径压缩时,我们也要加上它父节点到根节点的值,所以有va【x】+=va【fa【x】】

uino,则可以把他画成平行四边形。
在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
const int N=200100;
int fa[N+4],va[N+4],cnt,n,m;
void into()
{
	for(int i=0;i<N;i++){
		fa[i]=i;
	}
	memset(va,0,sizeof(va));
	cnt=0;
}
int Find(int x)
{
	if(fa[x]==x) return x;
	int root=Find(fa[x]);
	va[x]+=va[fa[x]];
	return fa[x]=root;
}
void uino(int x,int y,int w)
{
	int fx=Find(x);
	int fy=Find(y);
	fa[fx]=fy; //合并
	va[fx]=va[y]+w-va[x]; 
}
int main()
{
	int x,y,w;
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	while(cin>>n>>m){
	into();
	for(int i=1;i<=m;i++){
		cin>>x>>y>>w;
		x--;
		if(Find(x)!=Find(y)) uino(x,y,w);
		else{
			if(va[x]-va[y]!=w) cnt++;
		}
	}
	cout<<cnt<<endl;
}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值