結果
| 問題 |
No.9 モンスターのレベル上げ
|
| ユーザー |
|
| 提出日時 | 2023-08-11 23:17:20 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 7,210 bytes |
| コンパイル時間 | 652 ms |
| コンパイル使用メモリ | 36,276 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-18 18:37:25 |
| 合計ジャッジ時間 | 1,352 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 20 |
コンパイルメッセージ
main.c: In function 'main':
main.c:260:11: warning: passing argument 1 of 'scanf' from incompatible pointer type [-Wincompatible-pointer-types]
260 | scanf(&N);
| ^~
| |
| int *
In file included from main.c:4:
/usr/include/stdio.h:421:42: note: expected 'const char * restrict' but argument is of type 'int *'
421 | extern int scanf (const char *__restrict __format, ...) __wur;
| ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
main.c:283:19: warning: comparison between pointer and integer
283 | x = x > p.value ? x : p.value;
| ^
main.c:283:33: warning: pointer/integer type mismatch in conditional expression
283 | x = x > p.value ? x : p.value;
| ^
main.c:283:15: warning: assignment to 'int' from 'void *' makes integer from pointer without a cast [-Wint-conversion]
283 | x = x > p.value ? x : p.value;
| ^
ソースコード
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int key;
void* value;
} data;
typedef struct FibNode FibNode;
typedef struct FibNode FibNode;
struct FibNode {
FibNode* left;
FibNode* right;
FibNode* parent;
FibNode* child;
int key;
void* value;
bool mark;
int degree;
};
typedef FibNode FibHeap;
typedef FibNode FibElem;
FibNode* fib_node_init(int key, void* value) {
FibNode* new_node = (FibNode *)malloc(sizeof(FibNode));
new_node->left = new_node->right = new_node;
new_node->key = key;
new_node->value = value;
new_node->parent = NULL;
new_node->child = NULL;
new_node->mark = false;
new_node->degree = 0;
return new_node;
}
void fib_node_free(FibNode* to_free) {
to_free->degree = -1;
free(to_free);
}
void fib_node_kill(FibNode* to_kill) {
FibNode* kid = to_kill->child;
if (kid) {
kid->left->right = NULL;
while (kid->right != NULL) {
kid = kid->right;
fib_node_kill(kid->left);
}
fib_node_kill(kid);
}
fib_node_free(to_kill);
}
void fib_node_add(FibNode* old, FibNode* new_right) {
FibNode* oldRight = old->right;
assert(old != new_right);
assert(oldRight != new_right);
old->right = new_right;
oldRight->left = new_right;
new_right->left = old;
new_right->right = oldRight;
}
FibHeap* fib_heap_init(void) {
return NULL;
}
FibElem* fib_heap_add(FibHeap** H, FibNode* new_node) {
assert(H);
assert(new_node);
FibNode* old_node = *H;
new_node->parent = NULL;
new_node->mark = false;
if (old_node) {
fib_node_add(old_node, new_node);
if (old_node->key > new_node->key)
*H = new_node;
}
else {
new_node->left = new_node;
new_node->right = new_node;
*H = new_node;
}
return new_node;
}
FibElem* fib_heap_insert(FibHeap** H, int key, void* value) {
FibNode* new_node = fib_node_init(key, value);
return fib_heap_add(H, new_node);
}
bool is_empty_fib_heap(FibHeap* H) {
return H == NULL;
}
data fib_heap_min(FibHeap* H) {
assert(H);
data d;
FibNode* head = H;
d.key = head->key;
d.value = head->value;
return d;
}
data fib_heap_elem_data(FibElem* x) {
assert(x);
data d;
d.key = x->key;
d.value = x->value;
return d;
}
void fib_heap_remove_from(FibHeap** H, FibNode* x) {
assert(!x->parent);
if (x->right == x)
*H = NULL;
else {
x->left->right = x->right;
x->right->left = x->left;
*H = x->right;
}
x->left = x;
x->right = x;
x->parent = NULL;
}
FibHeap* fib_heap_union(FibHeap* H1, FibHeap* H2) {
if (!H1)
return H2;
if (!H2)
return H1;
if (fib_heap_min(H2).key < fib_heap_min(H1).key)
return fib_heap_union(H2, H1);
FibNode* H1first = H1;
FibNode* H1last = H1first->left;
FibNode* H2first = H2;
FibNode* H2last = H2first->left;
H1last->right = H2first;
H2first->left = H1last;
H2last->right = H1first;
H1first->left = H2last;
return H1first;
}
FibNode* fib_heap_link(FibHeap** H, FibNode* x, FibNode* y) {
assert(x);
assert(y);
assert(x->degree == y->degree);
if (x->key > y->key)
return fib_heap_link(H, y, x);
fib_heap_remove_from(H, y);
if (x->child) {
FibNode* z = x->child;
y->right = z;
y->left = z->left;
z->left->right = y;
z->left = y;
}
y->parent = x;
x->child = y;
x->degree++;
y->mark = false;
return x;
}
void fib_heap_match_degrees(FibHeap** H, FibNode** A, FibNode* x) {
int d = x->degree;
while (A[d]) {
if (d > 99)
exit(1);
FibNode* y = A[d];
if (y != x) {
x = fib_heap_link(H, x, y);
A[d] = NULL;
d++;
}
else
break;
}
A[d] = x;
}
void fib_heap_consolidate(FibHeap** H) {
FibNode* x = *H;
if (!x)
return;
FibNode** A = (FibNode**)calloc(100, sizeof(FibNode));
memset(A, '\0', 100);
assert(x->degree >= 0);
FibNode* last = x->left;
while(x != last) {
FibNode* next = x->right;
fib_heap_match_degrees(H, A, x);
x = next;
}
fib_heap_match_degrees(H, A, last);
*H = fib_heap_init();
for (int i=0; i<100; i++)
if (A[i])
fib_heap_add(H, A[i]);
free(A);
}
data fib_heap_extract_min(FibHeap** H) {
assert(H && *H);
FibNode* z = *H;
data d = fib_heap_elem_data(z);
FibNode* first = z->child;
fib_heap_remove_from(H, z);
fib_node_free(z);
if (first) {
FibNode* current = first->right;
while (current != first) {
current->parent = NULL;
current = current->right;
}
first->parent = NULL;
*H = fib_heap_union(*H, first);
}
fib_heap_consolidate(H);
return d;
}
void fib_heap_decrease_key(FibHeap** H, FibElem* x, int new_key) {
assert(H && *H);
assert(x && x->key >= new_key);
x->key = new_key;
if (x->parent && x->parent->key > new_key) {
if (x->left == x) {
assert(x->parent->degree == 2);
x->parent->child = NULL;
} else {
assert(x->parent->degree > 2);
x->left->right = x->right;
x->right->left = x->left;
x->parent->child = x->left;
}
x->parent->degree--;
fib_heap_add(H, x);
if (! x->parent->mark) {
x->parent->mark = true;
} else
fib_heap_decrease_key(H, x->parent, x->parent->key);
} else {
if (new_key < (*H)->key) {
assert(!x->parent);
*H = x;
}
}
}
void fib_heap_delete(FibHeap** H, FibElem* x) {
fib_heap_decrease_key(H, x, INT_MIN);
fib_heap_extract_min(H);
}
void fib_heap_free(FibHeap** H) {
FibNode* header = *H;
FibNode* first = header;
if (header) {
while(header != first) {
FibNode* next = header->right;
fib_node_kill(header);
header = next;
}
}
*H = NULL;
}
int main(void) {
int N;
scanf(&N);
int *A = (int *)malloc(N * sizeof(int));
int *B = (int *)malloc((2 * N) * sizeof(int));
if (A == NULL || B == NULL)
return 1;
FibHeap *pq_s = fib_heap_init();
for (int i = 0; i < N; i++) {
scanf("%d", &A[i]);
fib_heap_insert(&pq_s, A[i], 0);
}
for (int i = 0; i < N; i++) {
scanf("%d", &B[i]);
B[i + N] = B[i];
}
int ans = 1073741823;
for (int i = 0; i < N; i++) {
FibHeap *pq;
memcpy(pq, pq_s, sizeof(FibHeap));
int x = 0;
for (int j = 0; j < N; j++) {
data p = fib_heap_extract_min(&pq);
p.value++;
x = x > p.value ? x : p.value;
p.key += B[i + j] / 2;
fib_heap_insert(&pq, p.key, p.value);
}
ans = ans < x ? ans : x;
}
printf("%d\n", ans);
fib_heap_free(&pq_s);
free(A);
free(B);
return 0;
}