作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺梳理最后的知识点
题目
链接: 836. 合并集合 - AcWing题库
一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。
现在要进行 m 个操作,操作共有两种:
M a b
,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Q a b
,询问编号为 a 和 b 的两个数是否在同一个集合中;输入格式
第一行输入整数 n 和 m。
接下来 m 行,每行包含一个操作指令,指令为
M a b
或Q a b
中的一种。输出格式
对于每个询问指令
Q a b
,都要输出一个结果,如果 a 和 b 在同一集合内,则输出Yes
,否则输出No
。每个结果占一行。
数据范围
1≤n,m≤ 1 0 5 10^5 105
输入样例:
4 5 M 1 2 M 3 4 Q 1 2 Q 1 3 Q 3 4
输出样例:
Yes No Yes
代码实现
#include
using namespace std;
const int N=1e5+10;
int n,m;
int p[N];
int find(int x)
{
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) p[i]=i; //初始化
char op[2]; //使用字符串来处理 单个字母
int a,b;
while(m--)
{
scanf("%s%d%d",op,&a,&b);
if(op[0]=='M')
{
p[find(a)]=find(b); //集合合并,注意里面的find 里面的东西
}
else
{
find(a)==find(b)?printf("Yes\n"):printf("No\n"); //是否在同一个集合里面
}
}
return 0;
}
题目
链接: 842. 排列数字 - AcWing题库
给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
输入格式
共一行,包含一个整数 n。
输出格式
按字典序输出所有排列方案,每个方案占一行。
数据范围
1≤n≤7
输入样例:
3
输出样例:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
代码实现
#include
using namespace std;
const int N=10;
int a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
a[i]=i; //第一个全排列存到数组里面
do
{
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
cout<<endl;
}while(next_permutation(a+1,a+n+1)); //注意这里,这个数组中的元素个数,a+1,对应的 a+n 也要+1
return 0;
}