Submission #62323815


Source Code Expand

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int ec[212345], *es[212345];

void ae(int f, int t) {
	es[f] = realloc(es[f], sizeof(*es[f]) * (ec[f] + 1));
	if (es[f] == NULL) exit(2);
	es[f][ec[f]++] = t;
}

struct q_s {
	int node;
	int64_t cost;
};

int q_cap = 0, q_size = 0;
struct q_s* q;

void qadjust(int pos) {
	for (;;) {
		int i;
		int minpos = pos;
		for (i = 1; i <= 2; i++) {
			int c = pos * 2 + i;
			if (c < q_size && q[c].cost < q[minpos].cost) minpos = c;
		}
		if (minpos == pos) {
			if (pos == 0) return;
			pos = (pos - 1) / 2;
		} else {
			struct q_s temp = q[pos];
			q[pos] = q[minpos];
			q[minpos] = temp;
			pos = minpos;
		}
	}
}

void qadd(int node, int64_t cost) {
	if (q_size >= q_cap) {
		q = realloc(q, sizeof(*q) * (q_size + 1));
		if (q == NULL) exit(2);
		q_cap = q_size + 1;
	}
	q[q_size].node = node;
	q[q_size].cost = cost;
	q_size++;
	qadjust(q_size - 1);
}

struct q_s qget(void) {
	struct q_s ret;
	if (q_size <= 0) exit(42);
	ret = q[0];
	q_size--;
	if (q_size > 0) {
		q[0] = q[q_size - 1];
		qadjust(0);
	}
	return ret;
}

int N, M;
int A[212345];
int U[212345], V[212345];

int64_t node_cost[212345];
char deleted[212345];

int main(void) {
	int i, j;
	int64_t ans = 0;
	if (scanf("%d%d", &N, &M) != 2) return 1;
	for (i = 1; i <= N; i++) {
		if (scanf("%d", &A[i]) != 1) return 1;
	}
	for (i = 0; i < M; i++) {
		if (scanf("%d%d", &U[i], &V[i]) != 2) return 1;
		ae(U[i], V[i]);
		ae(V[i], U[i]);
	}
	for (i = 1; i <= N; i++) {
		for (j = 0; j < ec[i]; j++) {
			node_cost[i] += A[es[i][j]];
		}
		qadd(i, node_cost[i]);
	}
	while (q_size > 0) {
		struct q_s cur = qget();
		if (!deleted[cur.node]) {
			deleted[cur.node] = 1;
			if (ans < cur.cost) ans = cur.cost;
			for (i = 0; i < ec[cur.node]; i++) {
				int node = es[cur.node][i];
				if (!deleted[node]) {
					node_cost[node] -= A[cur.node];
					qadd(node, node_cost[node]);
				}
			}
		}
	}
	printf("%" PRId64 "\n", ans);
	return 0;
}

/*

全体のコストは、和ではなく最大値である
どれかの頂点を選んで操作を行わないと、先に進めない
操作により、続く操作にかかるコストが上がることはない

→ 今の状態をみて、かかるコストが最小の頂点を選んで操作すれば良い
→ プライオリティーキュー

*/

Submission Info

Submission Time
Task E - Erasing Vertices 2
User mikecat
Language C (gcc 12.2.0)
Score 0
Code Size 2437 Byte
Status WA
Exec Time 238 ms
Memory 16640 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 500
Status
AC × 2
AC × 14
WA × 18
Set Name Test Cases
Sample example_00.txt, example_01.txt
All example_00.txt, example_01.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt
Case Name Status Exec Time Memory
example_00.txt AC 1 ms 1628 KiB
example_01.txt AC 1 ms 1716 KiB
test_00.txt WA 196 ms 14796 KiB
test_01.txt WA 79 ms 8764 KiB
test_02.txt AC 85 ms 8012 KiB
test_03.txt WA 222 ms 15904 KiB
test_04.txt WA 119 ms 10180 KiB
test_05.txt WA 61 ms 6732 KiB
test_06.txt WA 186 ms 13256 KiB
test_07.txt WA 23 ms 3888 KiB
test_08.txt AC 19 ms 3560 KiB
test_09.txt WA 64 ms 8744 KiB
test_10.txt AC 1 ms 1596 KiB
test_11.txt AC 17 ms 3728 KiB
test_12.txt AC 11 ms 3036 KiB
test_13.txt AC 2 ms 1864 KiB
test_14.txt WA 233 ms 16388 KiB
test_15.txt WA 224 ms 16240 KiB
test_16.txt WA 226 ms 16256 KiB
test_17.txt WA 223 ms 16432 KiB
test_18.txt WA 222 ms 16356 KiB
test_19.txt WA 234 ms 16428 KiB
test_20.txt WA 238 ms 16432 KiB
test_21.txt WA 226 ms 16640 KiB
test_22.txt WA 230 ms 16428 KiB
test_23.txt WA 230 ms 16524 KiB
test_24.txt AC 81 ms 9100 KiB
test_25.txt AC 79 ms 8980 KiB
test_26.txt AC 79 ms 9152 KiB
test_27.txt AC 78 ms 8964 KiB
test_28.txt AC 80 ms 9088 KiB
test_29.txt AC 73 ms 9288 KiB