这题和4.15美团T5很相似,记录一下
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int p[N];
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i < N; i ++ ) p[i] = i;
for (int i = 1; i <= n; i ++ )
{
int x;
scanf("%d", &x);
x = find(x);
printf("%d ", x);
p[x] = x + 1;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int t[N];
int lowbit(int x) {
return x & -x;
}
void add(int x, int k) {
for (int i = x; i < N; i += lowbit(i)) t[i] += k;
}
int sum(int x) {
int res = 0;
for (int i = x; i; i -= lowbit(i)) res += t[i];
return res;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
int l = x, r = N;
while (l < r) {
int mid = l + r >> 1;
if (sum(mid) - sum(x - 1) < mid - (x - 1)) r = mid;
else l = mid + 1;
}
add(l, 1);
cout << l << ' ';
}
return 0;
}