题1
在一个学校里,一开始共有n个学生,而且每个学生都在不同的班级里(即每个班级只有一个人),学校为了节省费用,决定把一些班级进行合并。
每一次合并,学校都可以选择两位同学,接着将这两位同学所在的班级进行合并。
因为学校还要保证某些优秀的同学能够分到一个班,所以合并过后,学校就会询问某两位同学是否在同一班,是则输出Y,否则输出N。
例如,现在有5位同学。
第一次合并,将①同学和②同学所在的班级合并,那么①同学和②同学便在同一班里。
第二次合并,将①同学和③同学所在的班级合并。
因为在这次操作之前,①同学和②同学的班级已经进行合并了,所以②同学和③同学也在一个班级内。
输入格式
第一行为两个数n(1<=n<=100000),m(1<=m<=100000)
接下来的的m行分别是m次操作。格式如下
1 q b
或者是
2 q b (1<=q<=10000,1<=b<=10000)
其中:
1表示的是将q同学所在班级和b同学所在班级进行合并。
2表示的是询问q同学和b同学是否在同一个班,是则输出Y,否则输出N。
输出格式
共x(询问总次数)行
每行一个数,输出Y或N。
输入/输出例子1
输入:
5 4
1 1 2
2 1 2
1 1 3
2 2 3
输出:
Y
Y
样例解释
无
#include<bits/stdc++.h>
using namespace std;
int fa[100005],n,m;
int findroot(int x){
int r=x;
while(fa[r]!=r)
r=fa[r];
while(x!=r){
int t=x;
x=fa[x];
fa[t]=r;
}
return r;
}
void init(){
for(int i=1;i<=n;i++)
fa[i]=i;
}
int main(){
cin>>n>>m;
init();
while(m--){
int k,q,b;
cin>>k>>q>>b;
if(k==1){
int root1=findroot(q);
int root2=findroot(b);
if(root1!=root2){
fa[root1]=root2;
}
}
else{
int root1=findroot(q);
int root2=findroot(b);
if(root1!=root2)
cout<<"N"<<endl;
else
cout<<"Y"<<endl;
}
}
return 0;
}
第2题 卫星照片(satel) 查看测评数据信息
农夫 John 正在研究他的农场的卫星照片.照片为一个R (1 <=
R <= 75) 行 C (1 <= C <= 75) 列的字符矩阵表示.如下图: