【NOI2002】银河英雄传说

【NOI2002】银河英雄传说

这道题暴力模拟会TLE,因为它是并查集的一个应用……

#include<bits/stdc++.h>
using namespace std;
int t,p,qq,f[30005],q[30005],s[30005],r1,r2,num;
//f数组记录父子关系,q为队列记录某一战舰到队头距离,s记录某一队头所在队列战舰数量和
char ch; int find(int x)//并查集查找 { if(f[x]==x)return x; find(f[x]); q[x]+=q[f[x]]; return f[x]=find(f[x]);//压缩路径 } int main() { scanf("%d",&t); for(int i=1; i<=30000; i++) { f[i]=i; q[i]=0; s[i]=1; }//初始f数组以及2个队列 for(int i=1; i<=t; i++) { cin>>ch; scanf("%d%d",&p,&qq); r1=find(p),r2=find(qq);//并查集操作 if(ch=='M') { q[r1]+=s[r2]; f[r1]=r2;//r1父亲是r2 s[r2]+=s[r1];//移动后形成的舰队长度增加 s[r1]=0;//移动战舰队列后清空原队列 } else if(ch=='C') if(r1!=r2)printf("-1 "); else { num=abs(q[p]-q[qq])-1;//某一区间内战舰的数量就是其距离-1 printf("%d ",num); } } return 0; }
原文地址:https://www.cnblogs.com/yige2019/p/11328506.html