洛谷P1196 [NOI2002] 银河英雄传说
首先分析题目,数据范围特别大,500000组询问直接模拟肯定会超时,这里其实很容易可以想到用并查集。我们定义三个数组:fa[]表示每一个飞船的队首,front[]表示每一搜飞船到队首的距离,num[]表示以该飞船为队首的队伍中飞船的数量。每次M操作时就将x的队首的num值清空,并将fa值改变为y的队首,再将front值更新即可。询问时只要判断fa是否相等就可以了,不相等的话直接输出-1,否则输出abs(front[x]-front[y])-1。
Code:
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<iomanip>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int N=3e4+7;
- int n,fa[N],dis[N],cnt[N];
- inline int read()
- {
- char ch=getchar();int num=0;bool flag=false;
- while(ch<'0'||ch>'9'){if(ch=='-')flag=true;ch=getchar();}
- while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();}
- return flag?-num:num;
- }
- inline int Abs(int x)
- {return x>0?x:-x;}
- inline int find(int x)
- {
- if(fa[x]==x)return x;
- int fx=find(fa[x]);
- dis[x]+=dis[fa[x]];
- return fa[x]=fx;
- }
- int main()
- {
- n=read();
- char s;int x,y;
- for(int i=1;i<=30000;i++)
- fa[i]=i,dis[i]=0,cnt[i]=1;
- for(int i=1;i<=n;i++){
- cin>>s;
- x=read();y=read();
- int fx=find(x),fy=find(y);
- if(s=='M'){
- if(fx==fy)continue;
- dis[fx]+=cnt[fy];
- fa[fx]=fy;
- cnt[fy]+=cnt[fx];
- cnt[fx]=0;}
- else{
- if(fx!=fy)printf("-1\n");
- else printf("%d\n",Abs(dis[x]-dis[y])-1);
- }
- }
- return 0;
- }
蒟蒻写博客不易,如果有误还请大佬们提出
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:HolseLee
博客地址:www.cnblogs.com/cytus
个人邮箱:1073133650@qq.com
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:HolseLee
博客地址:www.cnblogs.com/cytus
个人邮箱:1073133650@qq.com
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?