妙啊,虽然题目给的意思好像并没有任取某些步骤的意思?
给定一个序列,和一些操作
每次操作可以选择是否交换x,y位置上的两个数字
问对于给定的序列最大的字典序是什么
对于每个操作操作次数无限
对于任意一个交换x,y可知,xy上的数字可以出现在任意x,y位置上
同理的x,y,z。。
不过讲道理这道题的表述还是有相当大的问题、、、
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;
#define sp system("pause")
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const int MAXN = 1000000 + 10;
int a[MAXN],fa[MAXN];
set<int>s[MAXN];
int getfa(int x)
{
return fa[x] == x ? x : fa[x] = getfa(fa[x]);
}
int main()
{
int n,m;
memset(a, 0, sizeof a);
for (int i = 0; i < MAXN; i++)fa[i] = i;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)scanf("%d", &a[i]);
for (int i = 1; i <= m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
int faa = getfa(x), fbb = getfa(y);
fa[faa] = fbb;
}
for (int i = 1; i <= n; i++)
s[getfa(i)].insert(a[i]);
for (int i = 1; i <= n; i++)
{
if (i!=1)printf(" ");
printf("%d", *(--s[getfa(i)].end()));
s[getfa(i)].erase(--s[getfa(i)].end());
}
printf("\n");
//sp;
}