Codeforces Problem 691D

来源:互联网 发布:java中的迭代器是什么 编辑:程序博客网 时间:2024/06/08 05:21

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 61 2 3 4 5 6 7 8 91 44 72 55 83 66 9
output
7 8 9 4 5 6 1 2 3

题意:有n个数字,m对位置上的数字可以互相交换,求交换后的最大数


思路:A B 可以互换 B C 可以互换 则 A C 也可以互换,先将可以互相交换的数都放入同一个集合,然后将同一个集合的数进行排序,从大到小放入原来的集合对应的位置中

#include<iostream>#include<string.h>#include<stdio.h>#include<algorithm>#include<queue>#include<functional>using namespace std;const int N = 1e6+10;int n,m,num[N],fa[N];int find(int x){    int be = x;    while(fa[x]!=x) x = fa[x];    while(fa[be]!=be){        int c = be;        be = fa[be];        fa[c] = x;    }    return x;}priority_queue<int,vector<int>,less<int> >q[N];int main(){        scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++){        scanf("%d",&num[i]);        fa[i] = i;    }    for(int i=0;i<m;i++){        int u,v;        scanf("%d%d",&u,&v);        int fau = find(u),fav = find(v);        fa[fau] = fav;    }    for(int i=1;i<=n;i++){        q[find(i)].push(num[i]);    }    for(int i=1;i<=n;i++){        int pos = find(i);        num[i] = q[pos].top();        q[pos].pop();    }    for(int i=1;i<=n;i++){        printf("%s%d",i==1?"":" ",num[i]);    }    printf("\n");    return 0;}


原创粉丝点击