首页 > 其他分享 >ABC 328F Good Set Query

ABC 328F Good Set Query

时间:2024-06-19 18:36:44浏览次数:20  
标签:Set return fa int 328F 祖先 ABC fa2 find

题意
直接看题吧https://atcoder.jp/contests/abc328/tasks/abc328_f

题解
本题主要考了带权并查集,具体实现是在路径压缩的时候顺便维护一下边权(其中w[i]表示点i距离它的祖先的边权之和,fa[i]是点i的祖先)。依次遍历每一次询问,如果询问中的a与b拥有公共祖先,也就是在同一个并查集里。那么直接访问w[a]-w[b]是否等与d即可。如果不在,那么说明在此之前他俩没关系,那么就要合并了,注意:合并是合并两者的祖先,那么俩个祖先之间的边权是多少呢?假如我们要把b的祖先合并到a所属的并查集里去,那么假设这个边为x,那么b这个点到最后的祖先的边权之和为w[b]+x。此时w[a]是不变的,那么w[a]-(w[b]+x)==d 可以很轻松地推导出x=w[a]-w[b]-d,本题结束。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
vector<int>ans;
int fa[maxn],w[maxn];

int find(int x)
{
	if (x!=fa[x])
	{
		int t=fa[x];
		fa[x]=find(fa[x]);
		w[x]+=w[t];
	}
	return fa[x];
}

bool hb(int x,int y,int d)//把y的祖先接给x的祖先 
{
	int fa1=find(x);
	int fa2=find(y);
	if(fa1==fa2)
	{
		if(w[x]-w[y]==d) return 1;
		else return 0;
	}
	else 
	{
		int xx=w[x]-w[y]-d;
		fa[fa2]=fa1;
		w[fa2]+=xx;
		return 1;
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		w[i]=0;
		fa[i]=i;
	}
	for(int i=1;i<=q;i++)
	{
		int a,b,d;
		cin>>a>>b>>d;
		if(hb(a,b,d)) ans.push_back(i);
	}
	for(int i=0;i<ans.size();i++)
	  cout<<ans[i]<<' ';
	
	return 0;
 } 

标签:Set,return,fa,int,328F,祖先,ABC,fa2,find
From: https://www.cnblogs.com/lulu7/p/18257009

相关文章

  • Mandelbrot set 以parallel_for_实现
       我们将以绘制曼德布罗集合为例,展示如何从常规的顺序代码轻松地修改代码以实现并行化计算。曼德布罗特集理论:曼德布罗特集的定义是以数学家本诺·曼德布罗特的名字命名的,由阿德里安·杜瓦迪命名。它因其在数学领域之外的形象表示而闻名,因为它是一个类分形的例子,一个在每......
  • 【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)
     您的点赞收藏是我继续更新的最大动力!一定要点击如下的蓝色字体链接,那是获取资料的入口!点击链接加入群聊【2024国赛资料合集】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey=%2BqQfThTxNnhw5LGJFRIcneF8JXBj1ufd2K01UpKPrpcgkKDskF......
  • 详解setTimeout()
    原文链接:https://blog.csdn.net/weixin_44179269/article/details/1134207671,setTimeout()基础setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器。vartimerId=setTimeout(func|code,delay)1上面代......
  • bitset详解以及用法
    butset详解以及用法bitset是C++标准库中的一个类,它提供了一种方便的方式来操作位序列,常用于位运算和状态压缩。下面我将为您详细介绍bitset的基本概念、基本用法以及一些常用的成员函数。基本概念1、bitset可以看作是一个多位二进制数,其每一位都是0或1。2、它是......
  • Ragas实践问题记录2 AttributeError: ‘TestsetGenerator‘ object has no attribute
    报错问题依然是在尝试官方文档“CompareLLMsusingRagasEvaluations”的“Createsynthetictestdata”步骤发生报错。官方文档以及文档中代码如下:Ragas:CompareLLMsusingRagasEvaluations官方文档中的代码:importosfromllama_indeximportdownload_loader,Simp......
  • ABC358
    E-AlphabetTileshttps://atcoder.jp/contests/abc358/tasks/abc358_e方案数DP。先看摆花(五年前做过)。记\(f_{i,j}\)表示摆完前\(i\)种花,目前已经有了\(j\)盆花的方案数。可以考虑先枚举当前摆第\(i\)种花,然后再枚举摆完第\(i\)种花之后,目前已经有了\(j\)盆......
  • ABC353F 分讨
    回来补补题。分析:我先考虑\(k\)很大的时候,大块和大块间的移动,我们不得不尽量避免小块:我们容易发现这样时是最优的,可以发现就是在斜着走,也就是典型的切比雪夫距离。斜着走一次需要经过两条边,所以花费是两倍的切比雪夫距离。要是起点和终点不在大块上呢?首先考虑它们不在同一......
  • PTA 6-3 tjrac - Java集合类之Set的HashSet之常用方法的使用
    importjava.util.HashSet;importjava.util.Scanner;importjava.util.Set;publicclassMain{publicstaticvoidmain(String[]args){ Scannerscan=newScanner(System.in); Stringzi=scan.nextLine();//首先我们定义一个字符串输入; ......
  • 【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)
     您的点赞收藏是我继续更新的最大动力!一定要点击如下的蓝色字体链接,那是获取资料的入口!点击链接加入群聊【2024国赛资料合集】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey=%2BqQfThTxNnhw5LGJFRIcneF8JXBj1ufd2K01UpKPrpcgkKDskF......
  • 【国赛赛题详解】2024年数学建模国赛ABCDEF题(点个关注,后续会更新)
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的蓝色字体链接,那是获取资料的入口!点击链接加入群聊【2024国赛资料合集】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eQt5WRIvc5-fogZRrrahAhbqDa2nKfW8&authKey=%2BqQfThTxNnhw5LGJFRIcneF8JXBj1ufd2K01UpKPrpcgkKDskFkr......