太坑人了啊,读入数据a,b,s的时候,我刚开始s用的%lld,给我WA。 实在找不到错误啊,后来不知怎么地突然有个想法,改成%I64d,竟然AC了

思路:我建立一个sum数组,设i的父亲为fa,sum[i]表示(fa,i]中的数的和(不包括fa,包括i),

  合并的时候,不是合并a,b,而是合并a-1,b。这样做的目是因为s是[a,b]的和,如果直接合并a,b,那么按照我数组的定义应该是(a,b]的和,这样不符合题意。

  接下来,每次读入a,b,只要根据他们父节点的不同情况分类讨论即可。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; const int maxn=;
int father[maxn];
long long sum[maxn]; //设i的父亲为fa,sum[i]表示(fa,i]中的数的和(不包括fa,包括i)
int n,m;
void init() {
for(int i=; i<=n; i++) {
father[i]=i;
sum[i]=;
}
} int find_root(int x) {
if(father[x]==x)
return x;
int fa=father[x];
father[x]=find_root(father[x]);
sum[x]=(sum[x]+sum[fa]);
return father[x];
}
//合并的时候,保证x<y
void Union(int x,int y) {
father[y]=x;
}
int main() {
int a,b,ans=;
long long s;
while(scanf("%d%d",&n,&m)!=EOF) {
init(); //怎么老忘记写这个啊
ans=;
for(int i=; i<=m; i++) {
scanf("%d%d%I64d",&a,&b,&s); //就是这里,本来用的是lld的格式,导致WA
int fa=find_root(a-);
int fb=find_root(b);
/*
fa=fb时,(fa,a-1]=sum[a-1],(fb,b]=sum[b],
——>[a,b]=sum[b]-sum[a-1],显然即应该等于s
若不等于,即使错误的
*/
if(fa==fb) {
if(sum[b]-sum[a-]!=s) {
ans++;
}
}
else {
if(fb>a-) {
/*
大小关系:fa<=a-1<fb<=b
(fa,a-1]=sum[a-1],[a,b]=s,(fb,b]=sum[b];
——>[a,fb]=s-sum[b],
(fa,fb]=(fa,a-1]+[a-1,fb]=sum[a-1]+s-sum[b];
*/
Union(fa,fb);
//更新fb的父节点fa到fb区间的和(不包括fa)
sum[fb]=sum[a-]+s-sum[b];
} else if(fb==a-) {
/*
大小关系:fa<=a-1=fb<=b
(fa,a-1]=sum[a-1],[a,b]=s,(fb,b]=sum[b];
——>sum[b]即为[a,b]的和。
若sum[b]不等于s,说明错误
如果相同,则合并
*/
if(s!=sum[b]) {
ans++;
} else {
Union(fa,fb);
sum[fb]=sum[a-];
}
}
//fb<a-1
else {
if(fb>fa) {
/*
大小关系:fa<fb<a-1<b
(fb,b]=sum[b],(a-1,b]=s ——>(fb,a-1]=sum[b]-s;
再由(fa,a-1]=sum[a-1]——>(fa,fb]=sum[a-1]-sum[b]+s;
*/
Union(fa,fb);
sum[fb]=sum[a-]-sum[b]+s;
}
else {
/*
大小关系:fb<fa<=a-1<=b
(fb,b]=sum[b],(a-1,b]=s,(fa,a-1]=sum[a-1];
——>(fa,b]=s+sum[a-1]
——>(fb,fa]=sum[b]-s-sum[a-1];
*/
Union(fb,fa);
sum[fa]=sum[b]-s-sum[a-];
} }
}
}
printf("%d\n",ans);
}
return ;
}

HDU 3038 How Many Answers Are Wrong(带权并查集)的更多相关文章

  1. hdu 3038 How Many Answers Are Wrong ( 带 权 并 查 集 )

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  2. HDU3038 How Many Answers Are Wrong —— 带权并查集

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 200 ...

  3. hdu3038How Many Answers Are Wrong(带权并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题解转载自:https://www.cnblogs.com/liyinggang/p/53270 ...

  4. HDU 1829 A Bug's Life 【带权并查集/补集法/向量法】

    Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes ...

  5. HDU3038 How Many Answers Are Wrong[带权并查集]

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  6. 【HDU3038】How Many Answers Are Wrong - 带权并查集

    描述 TT and FF are ... friends. Uh... very very good friends -________-b FF is a bad boy, he is always ...

  7. hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13

    了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了 ...

  8. How Many Answers Are Wrong(带权并查集)

    How Many Answers Are Wrong http://acm.hdu.edu.cn/showproblem.php?pid=3038 Time Limit: 2000/1000 MS ( ...

  9. HDU3038:How Many Answers Are Wrong(带权并查集)

    How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

随机推荐

  1. virtualbox安装增强包及配置共享文件夹

       因为需要在host及虚拟机间传输数据,想使用共享文件夹.但是单独设置了共享文件夹后在centos里找不到共享文件夹,看了下要安装增强包.好吧,顺 便也解决下鼠标切换的问题,省的老是按右CTL切换 ...

  2. 模板:abs用法

    c语言书本上说,数学函数除了求整数的绝对值函数abs()之外<abs() 定义在stdlib.h中>,其余的函数都在头文件 math.h 中定义,包括对浮点数求绝对值的函数fabs().c ...

  3. BMP文件格式分析

    前两天要做一个读取bmp文件的小程序,顺便查找了一些关于BMP格式的文章,现在post上来. 简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运 ...

  4. Headfirst设计模式的C++实现——策略模式(Strategy)

    前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h #inclu ...

  5. 字符串反转(charat)

    package com.java1234.chap03.sec08; public class zifufanzhuan { public static void main(String[] args ...

  6. Markdown 使用说明

    使用说明 ========= @[手册|帮助|Markdown] - **马克飞象**是一款专为印象笔记打造的Markdown编辑器. - 特别需要说明的一点是增加了`@(笔记本)[标签]`语法,以此 ...

  7. Mysql支持中文全文检索的插件mysqlcft-应用中的问题

    MySQL目前版本的全文检索没有对中文很好的支持,但可以通过安装mysqlcft插件来实现,具体的安装使用方法:http://blog.s135.com/post/356/ mysqlcft的官方网站 ...

  8. linux安装IPython四种方法

    IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib.之后按下Tab键,IPytho ...

  9. Antelope 和Barracuda区别

    Antelope是innodb-base的文件格式, Barracude是innodb-plugin后引入的文件格式,同时Barracude也支持Antelope文件格式.两者区别在于: 文件格式 支 ...

  10. ubuntu 下dbus的环境搭建和使用

    从https://launchpad.net/ubuntu/+source/dbus/1.10.6-1ubuntu2下载需要的dbus包,然后解压,./configure make && ...