快速变形码题集代码
时间: 2023-12-26 14:14:44 浏览: 129
由于快速变形码涉及到一些数学知识和算法,所以代码实现可能比较复杂。以下是一个 C++ 实现的例子,供参考:
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 5;
const int MAXM = 1e4 + 5;
int n, m, k, ans[MAXN], cnt[MAXM];
bool vis[MAXM];
vector<int> p[MAXM];
map<int, int> mp;
int get(int x) {
if (mp.find(x) == mp.end()) {
int sz = mp.size();
mp[x] = sz;
}
return mp[x];
}
int main() {
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
p[get(x)].push_back(i);
}
for (int i = 0; i < m; i++) {
if (vis[i]) continue;
for (int j = 0; j < p[i].size(); j++) {
int x = p[i][j];
ans[x] = k;
cnt[k]++;
if (cnt[k] == i + 1) {
k--;
vis[k] = true;
}
}
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << endl;
}
return 0;
}
```
在上述代码中,我们首先使用 `map` 来将输入的数字转换成一个唯一的整数,方便后续处理。然后我们遍历每个数字,将其出现的位置存储到对应的数组中。接下来,我们按照数字出现的次数从小到大依次处理,对于每个数字,我们将其出现的位置标记为当前的 `k` 值,并且将 `k` 减一。如果当前数字出现的次数达到了其出现次数,我们就将 `k` 再减一,并且将所有出现次数相同的数字都标记为已处理,以避免重复处理。
最终,我们遍历每个数字出现的位置,并且输出对应的标记值即可。
阅读全文