QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#733943#1873. ArraycomplexorWA 1ms9988kbC++232.4kb2024-11-10 22:17:142024-11-10 22:17:14

Judging History

你现在查看的是最新测评结果

  • [2024-11-10 22:17:14]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:9988kb
  • [2024-11-10 22:17:14]
  • 提交

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;
}

詳細信息

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