結果

問題 No.1524 Upward Mobility
ユーザー 👑 ygussany
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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