zoukankan      html  css  js  c++  java
  • codeforces 691D(数据结构)

    D. Swaps in Permutation
    time limit per test
    5 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given a permutation of the numbers 1, 2, ..., n and m pairs of positions (aj, bj).

    At each step you can choose a pair from the given positions and swap the numbers in that positions. What is the lexicographically maximal permutation one can get?

    Let p and q be two permutations of the numbers 1, 2, ..., np is lexicographically smaller than the q if a number 1 ≤ i ≤ n exists, so pk = qk for 1 ≤ k < i and pi < qi.

    Input

    The first line contains two integers n and m (1 ≤ n, m ≤ 106) — the length of the permutation p and the number of pairs of positions.

    The second line contains n distinct integers pi (1 ≤ pi ≤ n) — the elements of the permutation p.

    Each of the last m lines contains two integers (aj, bj) (1 ≤ aj, bj ≤ n) — the pairs of positions to swap. Note that you are given a positions, not the values to swap.

    Output

    Print the only line with n distinct integers p'i (1 ≤ p'i ≤ n) — the lexicographically maximal permutation one can get.

    Example
    input
    9 6
    1 2 3 4 5 6 7 8 9
    1 4
    4 7
    2 5
    5 8
    3 6
    6 9
    output
    7 8 9 4 5 6 1 2 3

    思路:可以先将所有可以交换的区间用并查集合并,然后用多个大根堆维护并查集的根可以的数字,最后只需依次将根可以的最小数字放到数组中即可,放一个数字则删除根元素。
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    using namespace std;
    priority_queue<int> ans[1000001];
    int n,m,p[1000001],father[1000001];
    int ask(int x)
    {
        if (father[x]==x) return x;
        father[x]=ask(father[x]);
        return father[x];
    }
    void hebin(int x,int y)
    {
        int p=ask(x);
        int q=ask(y);
        if (p!=q) father[p]=q;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        int i;
        for (i=1;i<=n;i++)
        {
            scanf("%d",&p[i]);
            father[i]=i;
        }
        while (m--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            hebin(x,y);
        }
        for (i=1;i<=n;i++) ans[father[ask(i)]].push(p[i]);
        for (i=1;i<=n;i++)
        {
            printf("%d ",ans[father[i]].top());
            ans[father[i]].pop();
        }
        return 0;
    }
  • 相关阅读:
    做人做事
    不骄不躁
    争取
    收入
    Windows 7下的Comodo Firewall免费防火墙
    成功水平
    成家立业
    Windows无法安装到GPT格式磁盘的根本解决办法
    安装Windows10操作系统
    安装操作系统的几种方式
  • 原文地址:https://www.cnblogs.com/hnqw1214/p/6498841.html
Copyright © 2011-2022 走看看