无名汉化组官网_neverland永无岛

无名汉化组官网_neverland永无岛永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b ,则称岛 a 和岛 b 是连通的。现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥。Q x k 表示询问当前与岛 x 连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪座,请你输出那

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示。

某些岛之间由巨大的桥连接,通过桥可以从一个岛到达另一个岛。

如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b ,则称岛 a 和岛 b 是连通的。

现在有两种操作:

B x y 表示在岛 x 与岛 y 之间修建一座新桥。
Q x k 表示询问当前与岛 x 连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪座,请你输出那个岛的编号。
输入格式
第一行是用空格隔开的两个正整数 n 和 m ,分别表示岛的个数以及一开始存在的桥数。

接下来的一行是用空格隔开的 n 个数,依次描述从岛 1 到岛 n 的重要度排名。

随后的 m 行每行是用空格隔开的两个正整数 ai 和 bi ,表示一开始就存在一座连接岛 ai 和岛 bi 的桥。

后面剩下的部分描述操作,该部分的第一行是一个正整数 q ,表示一共有 q 个操作,接下来的 q 行依次描述每个操作,操作的格式如上所述,以大写字母 Q 或 B 开始,后面跟两个不超过 n 的正整数,字母与数字以及两个数字之间用空格隔开。

输出格式
对于每个 Q x k 操作都要依次输出一行,其中包含一个整数,表示所询问岛屿的编号。

如果该岛屿不存在,则输出 −1。

数据范围
对于 20 的数据 n≤1000,q≤1000,
对于 100 的数据 n≤100000,m≤n,q≤300000

输入样例:
5 1
4 3 2 5 1
1 2
7
Q 3 2
Q 2 1
B 2 3
B 1 5
Q 2 1
Q 2 4
Q 2 3
输出样例:
-1
2
5
1
2
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100;
struct Node{ 

int s[2],v,p;
int size,flag;
int id;
void init(int _v,int _p,int _id){ 

v = _v,p  = _p,id = _id;
size = 1;
}
}tr[N];
int root[N],ctx;
int w[N];
int f[N];
void pushup(int u){ 

tr[u].size = tr[tr[u].s[0]].size + tr[tr[u].s[1]].size + 1;
}
void pushdown(int u){ 

return;
}
void rotate(int x){ 

int y = tr[x].p,z = tr[y].p;
int k = tr[y].s[1] == x;
tr[z].s[tr[z].s[1] == y] = x,tr[x].p = z;
tr[y].s[k] = tr[x].s[k ^ 1],tr[tr[x].s[k ^ 1]].p = y;
tr[x].s[k ^ 1] = y,tr[y].p = x;
pushup(y);
pushup(x);
}
void splay(int x,int k,int r){ 

while(tr[x].p != k){ 

int y = tr[x].p,z = tr[y].p;
if(z != k){ 

if((tr[z].s[1] == y) ^ (tr[y].s[1] == x))rotate(x);
else rotate(y);
}
rotate(x);
}
if(!k)root[r] = x;
}
int Find(int x){ 

return f[x] = (x == f[x] ? f[x] : Find(f[x]));
}
int insert(int r,int v,int id){ 
        //r代表root[r]
int u = root[r],p = 0;
while(u)p = u,u = tr[u].s[v > tr[u].v];
u = ++ ctx;
if(p)tr[p].s[v > tr[p].v] = u;
tr[u].init(v,p,id);
splay(u,0,r);
return u;
}
int get_th(int k,int r){ 

int u = root[r];
while(u){ 
       
if(tr[tr[u].s[0]].size >= k)u = tr[u].s[0];
else if(tr[tr[u].s[0]].size + 1 == k)return tr[u].id;
else k -= tr[tr[u].s[0]].size + 1,u = tr[u].s[1];
}
return -1;
}
void dfs(int u,int b){ 

if(tr[u].s[0])dfs(tr[u].s[0],b);
if(tr[u].s[1])dfs(tr[u].s[1],b);
insert(b,tr[u].v,tr[u].id);
}
int main(){ 

int n,m;
cin>>n>>m;
int x,y;
for(int i = 1;i <= n;i ++){ 

cin>>x;
root[i] = f[i] = i;
tr[i].init(x,0,i);
}
ctx = n;
for(int i = 0;i < m;i ++){ 

cin>>x>>y;
int a = Find(x),b = Find(y);
if(a != b){ 

if(tr[root[a]].size > tr[root[b]].size)swap(a,b);//把a插入到b中
dfs(root[a],b);//合并
f[a] = b;
}
}
char c;
cin>>m;
for(int i = 0;i < m;i ++){ 

cin>>c>>x>>y;
if(c == 'Q'){ 

int r = Find(x);
if(y > tr[root[r]].size)cout<<-1<<endl;
else cout<<get_th(y,r)<<endl;
}
else { 

int a = Find(x),b = Find(y);
if(a != b){ 

if(tr[root[a]].size > tr[root[b]].size)swap(a,b);//把a插入到b中
dfs(root[a],b);//合并
f[a] = b;
}
}
}
return 0;
}
  1. 每一次合并不创建新节点
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct Node{ 

int s[2],v,p;
int size,flag;
int id;
void init(int _v,int _p,int _id){ 

v = _v,p  = _p,id = _id;
size = 1;
}
}tr[N];
int root[N],ctx;
int w[N];
int f[N];
void pushup(int u){ 

tr[u].size = tr[tr[u].s[0]].size + tr[tr[u].s[1]].size + 1;
}
void pushdown(int u){ 

return;
}
void rotate(int x){ 

int y = tr[x].p,z = tr[y].p;
int k = tr[y].s[1] == x;
tr[z].s[tr[z].s[1] == y] = x,tr[x].p = z;
tr[y].s[k] = tr[x].s[k ^ 1],tr[tr[x].s[k ^ 1]].p = y;
tr[x].s[k ^ 1] = y,tr[y].p = x;
pushup(y);
pushup(x);
}
void splay(int x,int k,int r){ 

while(tr[x].p != k){ 

int y = tr[x].p,z = tr[y].p;
if(z != k){ 

if((tr[z].s[1] == y) ^ (tr[y].s[1] == x))rotate(x);
else rotate(y);
}
rotate(x);
}
if(!k)root[r] = x;
}
int Find(int x){ 

return f[x] = (x == f[x] ? f[x] : Find(f[x]));
}
int insert(int r,int x){ 
        //r代表root[r]
int u = root[r],p = 0;
while(u)p = u,u = tr[u].s[tr[x].v > tr[u].v];
if(p)tr[p].s[tr[x].v > tr[p].v] = x;
tr[x].p = p;
splay(x,0,r);
return u;
}
int get_th(int k,int r){ 

int u = root[r];
while(u){ 
       
if(tr[tr[u].s[0]].size >= k)u = tr[u].s[0];
else if(tr[tr[u].s[0]].size + 1 == k)return tr[u].id;
else k -= tr[tr[u].s[0]].size + 1,u = tr[u].s[1];
}
return -1;
}
void dfs(int u,int b){ 

if(tr[u].s[0])dfs(tr[u].s[0],b);
if(tr[u].s[1])dfs(tr[u].s[1],b);
insert(b,u);
}
int main(){ 

int n,m;
cin>>n>>m;
int x,y;
for(int i = 1;i <= n;i ++){ 

scanf("%d",&x);
root[i] = f[i] = i;
tr[i].init(x,0,i);
}
ctx = n;
for(int i = 0;i < m;i ++){ 

scanf("%d %d",&x,&y);
int a = Find(x),b = Find(y);
if(a != b){ 

if(tr[root[a]].size > tr[root[b]].size)swap(a,b);//把a插入到b中
dfs(root[a],b);//合并
f[a] = b;
}
}
char c;
cin>>m;
for(int i = 0;i < m;i ++){ 

cin>>c>>x>>y;
if(c == 'Q'){ 

int r = Find(x);
if(y > tr[root[r]].size)printf("-1\n");
else printf("%d\n",get_th(y,r));
}
else { 

int a = Find(x),b = Find(y);
if(a != b){ 

if(tr[root[a]].size > tr[root[b]].size)swap(a,b);//把a插入到b中
dfs(root[a],b);//合并
f[a] = b;
}
}
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168590.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • Python基础之lambda表达式

    Python基础之lambda表达式目录1、lambda函数介绍2、lambda函数与def函数的区别3、lambda案例4、map方法混搭有时在使用函数时不需要给函数分配一个名称,该函数就是“匿名函数”。在python中使用lambda表达式表示匿名函数语法:lambda参数列表:lambda体lambda是关键字声明,在lambda表达式中,参数列表与函数中的参数列表一样,但不需要用小括号括起来,冒号后面是lambda体,lambda表达式的主要代码在lambda体处编写,类似于函数体。提示:lambda体不能是一个代码块,不能包含多条

    2022年10月17日
  • python编程考试有哪些(python编程考试模拟题)

    python编程考试有哪些(python编程考试模拟题)2021国内外主流机器人编程赛事+等级考试Scratch编程、C++编程、Python编程等多个赛项,评比类、竞技类不同比赛形式自主选择。多个国内外主流机器人编程赛事,总能帮助孩子找到施展能力、表现创意的舞台。机器人、编程、人工智能等级考试篇全国青少年机器人技术等级考试和全国青少年软件编程等级考试均由中国电子…。2021机器人编程赛事+等级考试攻略之国内外主流赛事及能力测评篇上周,玛酷在公众号发布了一篇名为《2021机器人编程赛事+等级考试攻略之教育部白名单赛事篇》的文章。文章中为大家介绍了20

  • 铁总:1月25日全国铁路预计发送旅客破千万「建议收藏」

    铁总:1月25日全国铁路预计发送旅客破千万「建议收藏」铁总:1月25日全国铁路预计发送旅客破千万

  • 运维架构图[通俗易懂]

    运维架构图[通俗易懂]

  • 搞懂JavaScript全局变量与局部变量,看这篇文章就够了[通俗易懂]

    搞懂JavaScript全局变量与局部变量,看这篇文章就够了[通俗易懂]<scripttype=”text/javascript”>vara=”Hello”;functiontest(){vara;console.log(a);a=”World”;console.log(a);}//undefined//Worldvarb=”Hello”;fun…

  • PTP授时服务器(NTP网络时间服务器)技术方案应用

    PTP授时服务器(NTP网络时间服务器)技术方案应用PTP授时服务器(NTP网络时间服务器)技术方案应用PTP授时服务器(NTP网络时间服务器)技术方案应用摘要:文章介绍了北斗卫星系统授时原理,分析了北斗/GPS双模授时在CDMA无线通信系统中应用的可行性,并给出了北斗/GPS双模授时系统的组成和在CDMA中的两种应用方式。1、概述卫星导航定位与授时系统是现代化大国极为重要的基础设施,卫星导航系统提供的精密授时在一个国家的工业、国防、通信等领域有着广泛和重要的应用。目前的卫星导航系统主要有美国的全球卫星定位系统GPS、俄罗斯的全球卫星导航系统GLO

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号