看了题解,发现思路是差不多的,造了一些假数据,答案跟ac的代码输出也是一样的,除了一个TLE,别的也是过不了。
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <cstring>
#include <unordered_map>
using namespace std;
enum
{
kSiz = 1000008,
};
int arr[4][kSiz];
unordered_map<int, int> now, nex;
int n, m;
int getMin(unordered_map<int, int> &m)
{
if (m.empty())
{
return 0;
}
int i = 0;
for (i = 0; m.find(i) != m.end(); ++i)
{
}
return i;
}
// from a to b; c is old
bool trans(int *a, int *b, int *c, unordered_map<int, int> *now, int t, unordered_map<int, int> *nex)
{
(*nex).clear();
int same = 0;
for (int i = 0; i < n; ++i)
{
if (t < a[i])
{
b[i] = t;
}
else
{
auto it = (*now).find(a[i]);
if (it->second == 1)
{
b[i] = a[i];
}
else
{
b[i] = t;
}
}
(*nex)[b[i]]++;
if (b[i] == c[i])
{
++same;
}
}
return same == n;
}
void func()
{
scanf("%d%d", &n, &m);
now.clear();
nex.clear();
for (int i = 0; i < n; ++i)
{
scanf("%d", &arr[0][i]);
now[arr[0][i]]++;
}
unordered_map<int, int> *prev = &now;
unordered_map<int, int> *next = &nex;
int *a = arr[0];
int *b = arr[1];
int *c = arr[2];
c[1] = -1;
while (m--)
{
int t = getMin(*prev);
bool flag = trans(a, b, c, prev, t, next);
unordered_map<int, int> *tmp = prev;
prev = next;
next = tmp;
int *p = a;
a = b;
b = c;
c = p;
if (flag)
{
break;
}
}
if (m > 0 && m % 2 == 1)
{
a = c;
}
for (int i = 0; i < n; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
}
int main()
{
int k;
scanf("%d", &k);
while (k--)
{
func();
}
return 0;
}