結果

問題 No.1524 Upward Mobility
コンテスト
ユーザー ygussany
提出日時 2021-05-28 22:39:01
言語 C(gnu17)
(gcc 15.2.0)
コンパイル:
gcc-15 -O2 -std=gnu17 -Wno-error=implicit-function-declaration -Wno-error=implicit-int -DONLINE_JUDGE -o a.out _filename_ -lm
実行:
./a.out
結果
TLE  
実行時間 -
コード長 1,467 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 205 ms
コンパイル使用メモリ 39,020 KB
最終ジャッジ日時 2026-02-22 07:17:35
ジャッジサーバーID
(参考情報)
judge2 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample -- * 2
other AC * 3 TLE * 1 -- * 27
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

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