結果
| 問題 |
No.9 モンスターのレベル上げ
|
| ユーザー |
|
| 提出日時 | 2023-08-14 19:43:17 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,553 bytes |
| コンパイル時間 | 997 ms |
| コンパイル使用メモリ | 30,976 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-22 19:49:02 |
| 合計ジャッジ時間 | 4,465 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 4 WA * 16 |
ソースコード
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
typedef struct Pair {
int fst;
int snd;
} Key;
bool comp_greater(Key a, Key b) {
return a.fst == b.fst ? a.snd > b.snd : a.fst > b.fst;
}
bool comp_gt(Key a, Key b) {
return a.fst == b.fst ? a.snd >= b.snd : a.fst >= b.fst;
}
bool comp_less(Key a, Key b) {
return a.fst == b.fst ? a.snd < b.snd : a.fst < b.fst;
}
bool comp_lt(Key a, Key b) {
return a.fst == b.fst ? a.snd <= b.snd : a.fst <= b.fst;
}
bool comp_equal(Key a, Key b) {
return a.fst == b.fst && a.snd == b.snd;
}
size_t bheap_size;
Key bheap[4097];
void init_bheap(void) {
bheap_size = 0;
for (int i = 0; i < 4097; i++)
bheap[i] = (Key){INT_MAX, INT_MAX};
}
#define parent(i) ((i) >> 1)
#define left(i) ((i) << 1)
#define right(i) (((i) << 1) + 1)
void heapify_up(size_t sz) {
if (sz == 1)
return;
Key tmp;
if (comp_less(bheap[sz], bheap[parent(sz)])) {
tmp = bheap[sz];
bheap[sz] = bheap[parent(sz)];
bheap[parent(sz)] = tmp;
}
heapify_up(sz >> 1);
}
void heapify_down(size_t sz) {
if (right(sz) >= 4097)
return;
Key tmp;
if (comp_gt(bheap[sz], bheap[left(sz)])) {
tmp = bheap[sz];
bheap[sz] = bheap[left(sz)];
bheap[left(sz)] = tmp;
}
else if (comp_gt(bheap[sz], bheap[right(sz)])) {
tmp = bheap[sz];
bheap[sz] = bheap[right(sz)];
bheap[right(sz)] = tmp;
}
heapify_down(sz << 1);
}
void push_bheap(Key new_key) {
bheap[++bheap_size] = new_key;
heapify_up(bheap_size);
}
Key pop_bheap(void) {
Key ret = bheap[1];
bheap[1] = bheap[bheap_size--];
heapify_down(1);
return ret;
}
int main(void) {
int N;
scanf("%d", &N);
int A[3030], B[3030];
for (int i = 0; i < N; i++)
scanf("%d", &A[i]);
for (int i = 0; i < N; i++) {
scanf("%d", &B[i]);
B[i + N] = B[i];
}
int m = 1073741824;
for (int i = 0; i < N; i++) {
init_bheap();
for (int j = 0; j < N; j++)
push_bheap((Key){A[j], 0});
for (int j = 0; j < N; j++) {
Key x = pop_bheap();
push_bheap((Key){x.fst + B[i + j] / 2, x.snd + 1});
}
int tmp = 0;
while (bheap_size) {
Key x = pop_bheap();
tmp = tmp > x.snd ? tmp : x.snd;
}
m = m < tmp ? m : tmp;
}
printf("%d\n", m);
return 0;
}