QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#733943 | #1873. Array | complexor | WA | 1ms | 9988kb | C++23 | 2.4kb | 2024-11-10 22:17:14 | 2024-11-10 22:17:14 |
Judging History
answer
#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef std::pair<int, int> pii;
#define MP std::make_pair
#define fi first
#define se second
int read()
{
int s = 0, f = 1;
char c = getchar();
while (!(c >= '0' && c <= '9'))
f ^= (c == '-'), c = getchar();
while (c >= '0' && c <= '9')
s = s * 10 + (c - '0'), c = getchar();
return f ? s : -s;
}
const int MAXN = 500005, inf = 0x3f3f3f3f;
int n, rb[MAXN], nxt[MAXN], a[MAXN];
int used[MAXN];
int cnt[MAXN], tot, all;
void insert(int x) { if (!cnt[x]++) ++tot; }
void erase(int x){ if (!--cnt[x]) --tot; }
bool chk()
{
memset(cnt + 1, 0, n << 2), tot = 0;
for (int i = 1; i <= n; i++) insert(a[i]);
all = tot;
memset(cnt + 1, 0, n << 2), tot = 0;
for (int i = 1, j = 1; i <= n; i++)
{
while (tot < all && j <= n + 1) insert(a[j++]);
if (j - 1 != rb[i]) return false;
erase(a[i]);
}
return true;
}
bool chk(int cnt)
{
if (cnt < 0) return false;
memset(used + 1, false, n << 2);
for (int i = 1; i < n; i++)
if (rb[i] < rb[i + 1])
used[nxt[i] = rb[i + 1]]++;
nxt[n] = n + 1;
for (int i = 1; i < n; i++) used[rb[i]]++;
for (int i = n - 1, j = n; i; i--)
if (rb[i] == rb[i + 1])
{
if (rb[i] <= i + 1) return false;
if (cnt) { nxt[i] = n + 1, --cnt; continue; }
j = std::min(j, rb[i] - 1);
while (used[j] && j >= i + 1) j--;
if (j <= i) return false;
used[nxt[i] = j]++, used[rb[i]]--;
}
int v = 0;
for (int i = 1; i <= n; i++)
if (nxt[i] == n + 1) a[i] = ++v;
for (int i = n; i; i--)
if (nxt[i] <= n) a[i] = a[nxt[i]];
return true;
}
int main()
{
// freopen("sing.in", "r", stdin);
// freopen("sing.out", "w", stdout);
for (int T = read(); T--; )
{
n = read();
for (int i = 1; i <= n; i++) rb[i] = read();
int seg = 0;
for (int i = 1; i < n; i++) seg += rb[i] == rb[i + 1];
int l = -1, r = seg;
bool f = rb[1] <= n;
for (int i = 1; i <= n; i++)
f &= rb[i] >= i && (i == n || rb[i] <= rb[i + 1]);
if (!f) { printf("NO\n"); goto end; }
while (l < r)
{
int mid = (l + r) >> 1;
if (chk(mid)) r = mid;
else l = mid + 1;
}
if (l == -1) { printf("NO\n"); continue; }
chk(l);
if (chk())
{
printf("YES\n");
for (int i = 1; i <= n; i++)
printf("%d%c", a[i], " \n"[i == n]);
}
else printf("NO\n");
end:;
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 9988kb
input:
3 4 3 3 5 5 7 4 6 6 7 8 8 8 5 2 3 4 4 6
output:
YES 1 1 2 2 YES 3 2 4 1 2 3 4 NO
result:
wrong output format Expected integer, but "YES" found