hdu3038加权(扩展)并查集
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3038/
参考博客:
这是一道带权并查集的题目,设置了根节点到子节点之间的距离,可以利用向量性质更新每段上的值,假定结点编号为a的结点的值S[a]在结点之后的连线上,所以查询[l,r]的时候实际上是看[l,r+1]段,如果定义结点之前的连线上是该结点的值,则查询的区间实际上是[l-1,r]。利用向量性质实际上更新fx->fy=fx->x + x->y - fy->y ,对于一个节点i,S[i]就表示根节点到这个点的区间和。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a))
#define prime1 1e9+7
#define prime2 1e9+9
#define pi 3.14159265
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define scand(x) scanf("%llf",&x)
#define f(i,a,b) for(int i=a;i<=b;i++)
#define scan(a) scanf("%d",&a)
#define mp(a,b) make_pair((a),(b))
#define P pair<int,int>
#define dbg(args) cout<<#args<<":"<<args<<endl;
#define inf 0x3f3f3f3f
const int maxn=1e6+;
int n,m,t;
inline int read(){
int ans=,w=;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-;ch=getchar();}
while(isdigit(ch))ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return ans*w;
}
int ans;
int f[maxn],s[maxn];
void init()
{
f(i,,n)
{
f[i]=i;
s[i]=;
}
ans=;
}
int find(int x)
{
if(x==f[x])return x;//到达根结点的时候不需要有任何操作,只需要返回根就行
int tmp=f[x];//暂存f当前的根,因为在路径压缩之后当前的根节点会发生变化
f[x]=find(f[x]);
s[x]+=s[tmp];//将根节点的值加到当前结点上,相当于前缀和
return f[x];
}
void Union(int x,int y,int num)
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
{
if(s[y]-s[x]!=num)ans++;//x->y=rooty->y - rootx->x
}
else
{
f[fy]=fx;//保持根节点的值比较小
//fx根节点指向了新的结点,所以他的值需要改变,而原来以fx为根的结点的f值还未变化,所以s值不变
s[fy]=s[x]+num-s[y];//s[t]代表的是root->t的和
//故有rootx->rooty=rootx->x+x->y-rooty->y=s[x]+num-s[y]
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
std::ios::sync_with_stdio(false);
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
int u,v,w;
f(i,,m)
{
u=read(),v=read(),w=read();
Union(u-,v,w);//如果f是从0开始的话Union(u,v+1,w)也可用
}
// f(i,1,n)cout<<i<<":"<<f[i]<<":"<<s[i]<<endl;
pf("%d\n",ans);
}
}
hdu3038加权(扩展)并查集的更多相关文章
- hdu3038(带权并查集)
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=3038 题意: n表示有一个长度为n的数组, 接下来有m行形如x, y, d的输入, 表示 ...
- hdu3038(种类并查集,推荐)
题目大意:有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的?? 很有意思的一道题目,要是没有做过种类并查集,我肯定会以为这种题目是线段树题目...... 思路:我 ...
- hdu 3047(扩展并查集)
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU3038【种类并查集】
题意: 给出m组区间[a,b],以及其区间的和,问有矛盾的有几组: 思路: 种类并查集. 主要是几个关系:同类元素的关系,父亲与儿子的关系,不同类元素的关系: 我们可以类似看作一个前缀和,sum[x] ...
- hdu 3038(扩展并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:给出区间[1,n],下面有m组数据,l r v区间[l,r]之和为v,每输入一组数据,判断 ...
- hdu 1829(继续扩展并查集)
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- poj 1182 (扩展并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 58979 Accepted: 17247 Description ...
- BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]
题意: 给出m个区间和,询问是否有区间和和之前给出的矛盾 NOIp之前做过hdu3038..... 带权并查集维护到根的权值和,向左合并 #include <iostream> #incl ...
- POJ1703 Find them Catch them 关于分集合操作的正确性证明 种类并查集
题目链接:http://poj.org/problem?id=1703 这道题和食物链那道题有异曲同工之处,都是要处理不同集合之间的关系,而并查集的功能是维护相同集合之间的关系.这道题中有两个不同的集 ...
随机推荐
- 使用itchat发送天气信息
微信发送当日天气情况 念头萌生 之前在浏览网站的时候发现了篇文章「玩转树莓派」为女朋友打造一款智能语音闹钟,文章中介绍了使用树莓派打造一款语音播报天气的闹钟. 当时就想照着来,也自己做个闹钟.因为一直 ...
- C++走向远洋——22(项目一,三角形,类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...
- Java入门教程十三(多线程)
线程的概念 单纯种以一个任务完成以后再进行下一个任务的模式进行,这样下一个任务的开始必须等待前一个任务的结束,只有一个任务完成后才能进行下一个任务.Java 语言提供了并发机制,允许开发人员在程序中执 ...
- Golang/Python/PHP带你彻底学会gRPC
目录 一.gRPC是什么? 二.Protocol Buffers是什么? 三.需求:开发健身房服务 四.最佳实践 Golang 1. 安装protoc工具 2. 安装protoc-gen-go 3. ...
- 完全依赖QML实现播放器
前言 一直听闻QML无比强大好用,工作中需要扣一个同时播放视频的Demo,所以就趁这个机会研究了一下. 效果图和源码 源码仓库 主要设计 主页面QML import QtQuick 2.12 impo ...
- 使用Pods中使用Swift和Objective-C混编-编译不通过的原因
iOS开发#使用Pods中使用Swift和Objective-C混编-编译不通过的原因-ld: symbol(s) not found for architecture arm64 问题基本描述 在P ...
- Java 集合、数组排序
在平时开发的过程中,经常会遇到需要对数组.集合中元素按规则进行排序,本文记录在开发过程中可能遇到的情况以及相关的完整代码示例. 知识点 Comparable<T>接口 实现了该接口的对象, ...
- html+css布局类型
一.单列布局 1.代码如下 <!doctype html> <html> <head> <meta charset="utf-8"/> ...
- Vue请求第三方接口跨域最终解决办法!2020最终版!
废话少说,再百度的近三个小时尝试了近10种方法无解后,终于皇天不负有心人! 这个vue axios 跨域问题被我解决了! 需求:请求客户端ip地址获取客户ip,再根据ip获取用户位置 工具:Vue,a ...
- Python 存储数据到json文件
1 前言 很多程序都要求用户输入某种信息,程序一般将信息存储在列表和字典等数据结构中. 用户关闭程序时,就需要将信息进行保存,一种简单的方式是使用模块json来存储数据. 模块json让你能够将简单的 ...