首页 > 其他分享 >history 题解(并查集)

history 题解(并查集)

时间:2023-02-24 19:57:17浏览次数:41  
标签:int 题解 查集 long fa siz history define

考虑使用边带权并查集维护点之间的连通性,边权为这条边建立的时间,查询时如果查询时间小于边权则不能通行(巧妙地处理了时间的性质)。

由于时间这种东西性质特殊无法路径压缩,所以使用按秩合并。

code:

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define debug cout<<"DEBUG"<<endl;
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define imp map<int,int>
using namespace std;
const int N=3e5+5;
int n,m,fa[N],d[N],siz[N],tim,c;
bool op;
void merge(int x,int y){
	if(siz[x]>siz[y]){
		swap(x,y);
	}
	fa[x]=y;
	d[x]=tim;
	siz[y]+=siz[x];
}
int find(int x,int t){
	f(fa[x]==x||d[x]>t) return x;
	return find(fa[x],t);
}
int main(){
	freopen("history.in","r",stdin);
	freopen("history.out","w",stdout);
	while(cin>>n>>m){
		op=0;
		c=0;
		tim=0;
		for(int i=0;i<=n;i++){
			fa[i]=i;
			siz[i]=1;
			d[i]=0;
		}
		while(m--){
			char sc[5];
			scanf("%s",sc+1);
			if(sc[1]=='K'){
				op=0;
				scanf("%d",&c);
			}
			if(sc[1]=='R'){
				tim++;
				int x,y;
				scanf("%d%d",&x,&y);
				if(op){
					x=(x+c)%n;
					y=(y+c)%n;
				}
				int fx=find(x,tim);
				int fy=find(y,tim);
				if(fx!=fy){
					merge(fx,fy);
				}
			}
			if(sc[1]=='T'){
				int x,y,z;
				scanf("%d%d%d",&x,&y,&z);
				int nx=find(x,tim);
				int ny=find(y,tim);
				int ox=find(x,tim-z);
				int oy=find(y,tim-z);
				if(ox!=oy&&nx==ny){
					op=0;
					printf("Y\n");
				}else{
					op=1;
					printf("N\n");
				}
			}
		}
	}
	return 0;
}

标签:int,题解,查集,long,fa,siz,history,define
From: https://www.cnblogs.com/victoryang-not-found/p/17152936.html

相关文章

  • 新版 Mac M2 安装老 saas 项目 报 Gem sass is not installed 问题解决
     换了新电脑,需要把老项目git拉下来再跑起来的时候发现生成样式文件的时候会报这个错误,(N年前老项目,用的是node-sass,[email protected]版本比较老旧,但项目还是要......
  • vue——更改路由模式为history后,刷新页面显示Cannot Get/空白/404,本地icon图标不显示
    参考:https://blog.csdn.net/william_jzy/article/details/106526339   https://www.bbsmax.com/A/A7zgKEVkz4/      https://router.vuejs.org/zh/gu......
  • CF1131B 题解
    题目传送门好水的绿题,当放松了。题目分析为了方便表述,定义\(lsta,lstb,nowa,nowb\),分别表示上次双方的得分以及当前的得分。考虑分讨,若\(lsta=lstb\),贡献即\(\min(n......
  • P6666 [清华集训2016] 数据交互 题解
    ##P6666[清华集训2016]数据交互题解###简要题意:n个点的树,m次操作,分别为添加一条路径$(u_i,v_i,w_i)$,和撤消一条路径,每一次操作后求出一条路径使得与这条路径有交的......
  • P8422 题解
    前言题目传送门!更好的阅读体验?第三道大模拟,写篇题解庆祝一下。文中粗体字是我踩坑的地方,欢迎统计我被坑了多少次。思路终局奖分很简单,放在主函数里,所以我们看每次的......
  • 树剖练习题题解总和(动态更新)
    这篇博客的练习题题解1、P3384【模板】轻重链剖分/树链剖分模板题,详见此#include<iostream>#include<cstdio>#include<vector>usingnamespacestd;intn,m,r,p,t[......
  • P3571 [POI2014]SUP-Supercomputer 题解
    首先有一个结论,树中存在一个深度\(dep\),使得深度小于等于\(dep\)的点只需\(dep\)次覆盖完,而大于\(dep\)的除最后一次外其他每次都可以填充\(k\)次。证明:在\(dep......
  • P4768 [NOI2018] 归程 题解
    这是一个悲伤的题目,自这道题后,\(\text{Noi}\)再无\(\text{SPFA}\)。首先讲一下重构树是啥。重构树是基于\(\text{kurskal生成树}\)算法的一棵树,对于每一次合并一条......
  • P3247 [HNOI2016]最小公倍数 题解
    题意简述:给定一个无向图,边权带两个值\((a,b)\),给定\(q\)次询问,每次询问给定两个点,求两个点直接是否有\(\max(a)=x\)且\(\max(b)=y\)的简单或非简单路径。解:如果......
  • P2489 [SDOI2011]迷宫探险 题解
    题意简述:一个\(n\timesm\)的带墙体单入口多出口迷宫中有\(k\)个陷阱,陷阱分为有害或无害,有害会使人掉血,给出所有垃圾的有害与无害的所有排列组成的概率,给定人的血量,求......