首页 > 其他分享 >题解:AT_abc372_e [ABC372E] K-th Largest Connected Components

题解:AT_abc372_e [ABC372E] K-th Largest Connected Components

时间:2024-09-23 15:46:58浏览次数:1  
标签:p2 p1 return int 题解 ABC372E tree Components find

题意

给出 \(q\) 个操作。

  1. 将 \(u\) 和 \(v\) 连边。
  2. 问 \(u\) 所在的连通块中编号第 \(k\) 大的点。

思路

连通块很容易想到并查集,求第 \(k\) 大可以用平衡树(虽然赛时没看到 \(k\le 10\)),合并时将信息从将小的连通块合并到大的连通块,这样可以减少时间复杂度。
什么?你不会写平衡树?直接套 pbds 库中的 tree 就可以了(具体见代码)。

代码

#include<bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;//注意使用pbds库时需要加上头文件和命名空间
struct bal_tree{
	tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> t;//使用tree的方式,具体参数可以上网查,不会的直接复制就可以了
	void insert(int x){t.insert(x);}
	void del(int x){t.erase(t.upper_bound(x));}
	int rnk(int x){return t.order_of_key(x)+1;}
	int find_rnk(int x){return *t.find_by_order(x-1);}
	int upper_bound(int x){return *t.upper_bound(x);}
	int lower_bound(int x){return *t.lower_bound(x);}
}t[200005]; 
int n,q,f[200005];
int find(int x){
	if(f[x]!=x) f[x]=find(f[x]);
	return f[x];
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		f[i]=i,t[i].insert(i);
	while(q--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			int p1=find(x),p2=find(y);
			if(p1!=p2){
				if(t[p1].t.size()>t[p2].t.size())
					swap(p1,p2);
				f[p1]=p2;
				for(int v:t[p1].t)
					t[p2].insert(v);
				t[p1].t.clear();
			}
		}
		else{
			x=find(x);
			if(t[x].t.size()<y)
				cout<<-1<<endl;
			else
				cout<<t[x].find_rnk(t[x].t.size()-y+1)<<endl;//注意是第k大
		}
	}
	return 0;
}

标签:p2,p1,return,int,题解,ABC372E,tree,Components,find
From: https://www.cnblogs.com/WuMin4/p/18427157

相关文章

  • 题解:AT_arc184_a [ARC184A] Appraiser
    题意\(1000\)个硬币中有\(10\)个假币,你每次可以询问两个位置的硬币类型是否相同,你需要用不超过\(950\)次询问找出所有假币的位置。思路将前\(990\)个硬币每\(11\)个分一组,共\(90\)组,余\(10\)个单独分一组。询问每组第\(1\)个硬币和这组后面硬币的关系。因为只......
  • CF1270H Number of Components 题解
    Description给一个长度为\(n\)的数组\(a\),\(a\)中的元素两两不同。对于每个数对\((i,j)(i<j)\),若\(a_i<a_j\),则让\(i\)向\(j\)连一条边。求图中连通块个数。支持\(q\)次修改数组某个位置的值,每次修改后输出图中连通块个数。\(n,q\le5\times10^5,1\lea_i\le10^......
  • 2024ICPC网络赛第二场题解(部分)
    前言这场相对作用大一点,最后顶着队友的怀疑压力乱搞出了C,但是后面看题解发现似乎是数据弱了跑过去,其实复杂度是队友分析的那样,是不正确的,但是毕竟是打名额的比赛,过了就是过了,这里分享一下C题的乱搞做法,以及其他题的我们队赛时代码。下面的顺序按过题顺序(也差不多是难度递增顺序)......
  • 网站程序打不开数据库错误等常见问题解决方法
    当遇到网站打不开或者数据库错误等问题时,可以按照以下步骤来诊断并解决问题:检查网站根目录:如果上传数据后显示“主机开设成功!”或“恭喜,lanmp安装成功!”,这通常是因为服务器默认放置了一个index.htm文件。此时应检查wwwroot目录内是否有自己的程序文件,并考虑删除默认的index.h......
  • 题解:AT_arc184_a [ARC184A] Appraiser
    本质上还是官方题解的分组并利用\(M\)不大的思路。询问次数\(Q\)离最简单的每个扫一遍就可以知道答案的做法少了\(50\)次。我们考虑如何减少这个次数。首先你可以发现一次询问可以覆盖到两个数,也就是说所有的数都被覆盖时只需要询问\(500\)次。我们考虑把不同的对拉出......
  • 网站打不开数据库错误等常见问题解决方法
    当遇到网站打不开且出现数据库错误等问题时,可以采取以下步骤进行排查和解决:检查默认页面:如果网站显示“主机开设成功!”或者“恭喜,lanmp安装成功!”这样的信息,这可能是服务器默认放置的页面。检查wwwroot目录下是否有自己的程序文件,如果没有,上传正确的文件,并删除默认的index.ht......
  • [ABC371F] Takahashi in Narrow Road 题解
    洛谷题目链接Atcoder题目链接前言这道题我赛时想到了正解并打了出来,然后因为把\(l\)打成了\(1\)导致WA\(\times23\),然后又没场切六道题(悲。然后赛后有人说正解是珂朵莉树/线段树,然而我是珂朵莉树\(+\)线段树,呵。题意数轴上有\(n\)个人,第\(i\)个人初始在\(X_i\)处,每一次操作......
  • CF1239E Turtle 题解
    Description一只乌龟从\(2\timesn\)的棋盘的左上角走到右下角,只能往下或往右,需要给出一种方案来分配\(2n\)个数字使得乌龟走过的路径上的数之和的最大值最小。\(2\leqn\leq25,0\leqa_{1,i},a_{2,i}\leq5\times10^4\)。Solution设\(pre_{i}=\sum_{j=1}^{i}{a_{1,i}......
  • P5975 photo 题解
    Solution先离散化,记\(f(l,r,p)\)为覆盖了\([l,r]\)区间内纵坐标\(\gep\)的点最少矩形个数。则:\[f(l,r,p)=\min(f(l,r,p),f(l,mid,p)+f(mid+1,r,p))\]\[f(l,r,p)=\min(f(l,r,p),f(l,r,res)+1)\]令\(h\)为用面积为\(S\)的矩形去覆盖\([l,r]\)区间的高度,即\(S/(r......
  • P9192 Pareidolia 题解
    Statement给串\(t\),定义\(B(s)\)为\(s\)删一些字符后能出现最多多少个bessie,\(A(t)\)表示对\(t\)的所有子串\(s\)求\(B(s)\)的和,有\(q\)次单点修改,每次改完输出\(B(s)\).Solution动态dp,但是带矩乘\(6^3\)常数,不好.还是考虑分治咋做.现在有区间\([l,mid],......