結果
| 問題 | No.1888 Odd Insertion |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2022-03-06 19:18:36 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,824 bytes |
| 記録 | |
| コンパイル時間 | 1,446 ms |
| コンパイル使用メモリ | 33,116 KB |
| 実行使用メモリ | 29,312 KB |
| 最終ジャッジ日時 | 2024-07-21 05:13:56 |
| 合計ジャッジ時間 | 25,662 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 31 WA * 6 |
ソースコード
#include <stdio.h>
#include <sys/time.h>
void add_BIT(int N, int BIT[], int i, int k)
{
while (i <= N) {
BIT[i] += k;
i += (i & -i);
}
}
int sum_BIT(int BIT[], int r)
{
int sum = 0;
while (r > 0) {
sum += BIT[r];
r -= (r & -r);
}
return sum;
}
void add_xor_BIT(int N, int BIT[], int i)
{
while (i <= N) {
BIT[i] ^= 1;
i += (i & -i);
}
}
int sum_xor_BIT(int BIT[], int r)
{
int sum = 0;
while (r > 0) {
sum ^= BIT[r];
r -= (r & -r);
}
return sum;
}
struct timeval t;
double beg, cur;
int memo[200001], r;
int recursion(int N, int l, int P_inv[], int BIT[], int ans[])
{
if (l > N) return 1;
else if (memo[l] != 0) return 0;
gettimeofday(&t, NULL);
cur = t.tv_sec + (double)t.tv_usec / 1000000;
if (cur - beg > 1.95) return 0;
int i;
if (sum_xor_BIT(BIT, P_inv[l] - 1) == 0) {
add_xor_BIT(N, BIT, P_inv[l]);
ans[0] = l;
if (recursion(N, l + 1, P_inv, BIT, &(ans[1])) != 0) return 1;
add_xor_BIT(N, BIT, P_inv[l]);
}
if (P_inv[l] % 2 == 0) {
for (i = l + 1; i < r; i++) {
gettimeofday(&t, NULL);
cur = t.tv_sec + (double)t.tv_usec / 1000000;
if (cur - beg > 1.95) return 0;
if (sum_xor_BIT(BIT, P_inv[i] - 1) != 0) break;
add_xor_BIT(N, BIT, P_inv[i]);
ans[i-l-1] = i;
if (sum_xor_BIT(BIT, P_inv[l] - 1) == 0) {
add_xor_BIT(N, BIT, P_inv[l]);
ans[i-l] = l;
if (recursion(N, i + 1, P_inv, BIT, &(ans[i-l+1])) != 0) return 1;
add_xor_BIT(N, BIT, P_inv[l]);
}
}
} else {
for (i = l + 1; i <= N; i++) {
gettimeofday(&t, NULL);
cur = t.tv_sec + (double)t.tv_usec / 1000000;
if (cur - beg > 1.95) return 0;
if (sum_xor_BIT(BIT, P_inv[i] - 1) != 0) break;
add_xor_BIT(N, BIT, P_inv[i]);
ans[i-l-1] = i;
if (sum_xor_BIT(BIT, P_inv[l] - 1) == 0) {
add_xor_BIT(N, BIT, P_inv[l]);
ans[i-l] = l;
if (recursion(N, i + 1, P_inv, BIT, &(ans[i-l+1])) != 0) return 1;
add_xor_BIT(N, BIT, P_inv[l]);
}
}
}
for (i--; i > l; i--) add_xor_BIT(N, BIT, P_inv[i]);
memo[l] = -1;
while (memo[r] != 0) r--;
return 0;
}
int solve(int N, int P[], int ans[])
{
static int i, P_inv[200001], BIT[200001];
for (i = 1, memo[0] = 0; i <= N; i++) {
P_inv[P[i]] = i;
BIT[i] = 0;
memo[i] = 0;
}
r = N;
return recursion(N, 1, P_inv, BIT, &(ans[1]));
}
int main()
{
gettimeofday(&t, NULL);
beg = t.tv_sec + (double)t.tv_usec / 1000000;
int i, N, P[200001], P_inv[200001], ans[200001], BIT[200001] = {};
scanf("%d", &N);
for (i = 1; i <= N; i++) scanf("%d", &(P[i]));
if (solve(N, P, ans) == 0) printf("No\n");
else {
printf("Yes\n");
for (i = 1; i <= N; i++) P_inv[P[i]] = i;
for (i = 1; i <= N; i++) {
printf("%d %d\n", ans[i], sum_BIT(BIT, P_inv[ans[i]] - 1) + 1);
add_BIT(N, BIT, P_inv[ans[i]], 1);
}
}
fflush(stdout);
return 0;
}