蓝桥杯刷题冲刺 | 倒计时3天

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

梳理最后的知识点

文章目录

  • 1.并查集
  • 2.排列数字

1.并查集

  • 题目

    链接: 836. 合并集合 - AcWing题库

    一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。

    现在要进行 m 个操作,操作共有两种:

    1. M a b,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
    2. Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;

    输入格式

    第一行输入整数 n 和 m。

    接下来 m 行,每行包含一个操作指令,指令为 M a bQ 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;
    }
    

2.排列数字

  • 题目

    链接: 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;  
     }
    

Alt

你可能感兴趣的:(蓝桥杯倒计时冲刺,蓝桥杯,c++,算法)