結果
| 問題 |
No.1524 Upward Mobility
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2021-05-28 22:39:01 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,467 bytes |
| コンパイル時間 | 1,111 ms |
| コンパイル使用メモリ | 29,440 KB |
| 実行使用メモリ | 15,872 KB |
| 最終ジャッジ日時 | 2024-11-07 10:01:10 |
| 合計ジャッジ時間 | 8,783 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 2 |
| other | AC * 3 TLE * 1 -- * 27 |
ソースコード
#include <stdio.h>
typedef struct List {
struct List *next, *prev;
int v;
long long sum;
} list;
int main()
{
int i, N, a[100001], b[100001], par[100001];
scanf("%d", &N);
for (i = 2, par[1] = 1; i <= N; i++) scanf("%d", &(par[i]));
for (i = 1; i <= N; i++) scanf("%d", &(a[i]));
for (i = 1; i <= N; i++) scanf("%d", &(b[i]));
int u, w;
list head[100001], tail[100001], d[100001], *p, *pp;
for (u = 1; u <= N; u++) {
head[u].prev = NULL;
head[u].next = &(tail[u]);
head[u].v = 0;
head[u].sum = 1LL << 60;
tail[u].prev = &(head[u]);
tail[u].next = NULL;
tail[u].v = N + 1;
tail[u].sum = 0;
}
for (w = N; w >= 1; w--) {
u = par[w];
for (pp = &(head[w]); pp->next->v < a[w]; pp = pp->next);
d[w].v = a[w];
d[w].sum = pp->next->sum + b[w];
d[w].prev = pp;
d[w].next = pp->next;
pp->next->prev = &(d[w]);
pp->next = &(d[w]);
while (pp->sum <= pp->next->sum) {
pp = pp->prev;
pp->next->next->prev = pp;
pp->next = pp->next->next;
}
if (w == 1) break;
for (p = head[u].next, pp = head[w].next; pp->next != NULL; ) {
if (p->v > pp->v) {
pp = pp->next;
pp->prev->sum += p->sum;
if (pp->prev->sum > p->sum) {
pp->prev->prev = p->prev;
pp->prev->next = p;
p->prev->next = pp->prev;
p->prev = pp->prev;
}
} else {
while (p->v < pp->v) {
p->sum += pp->sum;
p = p->next;
}
}
}
}
printf("%lld\n", head[1].next->sum);
fflush(stdout);
return 0;
}