Submission #73225976


Source Code Expand

Copy
#include <stdio.h>
#include <stdlib.h>
struct yokobou_s {
int a, b;
};
/* b → a */
int cmp(const void* x, const void* y) {
struct yokobou_s a = *(const struct yokobou_s*)x, b = *(const struct yokobou_s*)y;
return
((a.b < b.b) - (a.b > b.b)) * 2 +
((a.a > b.a) - (a.a < b.a));
}
int n, m, h, k;
int s[1024];
struct yokobou_s ab[114514];
int pos[1024];
int dore[114514][2];
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <stdlib.h>

struct yokobou_s {
	int a, b;
};

/* bの降順 → aの昇順 */
int cmp(const void* x, const void* y) {
	struct yokobou_s a = *(const struct yokobou_s*)x, b = *(const struct yokobou_s*)y;
	return
		((a.b < b.b) - (a.b > b.b)) * 2 +
		((a.a > b.a) - (a.a < b.a));
}

int n, m, h, k;
int s[1024];
struct yokobou_s ab[114514];

int pos[1024];
int dore[114514][2];
char used[1024];

int main(void) {
	int i;
	int cur = 0, ans;
	if (scanf("%d%d%d%d", &n, &m, &h, &k) != 4) return 1;
	for (i = 1; i <= n; i++) {
		if (scanf("%d", &s[i]) != 1) return 1;
	}
	for (i = 0; i < m; i++) {
		if (scanf("%d%d", &ab[i].a, &ab[i].b) != 2) return 1;
	}
	qsort(ab, m, sizeof(*ab), cmp);
	for (i = 1; i <= n; i++) {
		pos[i] = i;
	}
	for (i = 0; i < m; i++) {
		int t;
		dore[i][0] = pos[ab[i].a];
		dore[i][1] = pos[ab[i].a + 1];
		t = pos[ab[i].a];
		pos[ab[i].a] = pos[ab[i].a + 1];
		pos[ab[i].a + 1] = t;
	}
	for (i = 1; i <= k; i++) {
		cur += s[pos[i]];
		used[pos[i]] = 1;
	}
	ans = cur;
	for (i = 0; i < m; i++) {
		int candidate = cur;
		if (used[dore[i][0]] && !used[dore[i][1]]) {
			candidate -= s[dore[i][0]];
			candidate += s[dore[i][1]];
		} else if (!used[dore[i][0]] && used[dore[i][1]]) {
			candidate -= s[dore[i][1]];
			candidate += s[dore[i][0]];
		}
		if (candidate < ans) ans = candidate;
	}
	printf("%d\n", ans);
	return 0;
}

/*

横棒の削除 → その横棒の真下に横棒を追加して入れ替えるのと同じ
その横棒を通る2本のみに影響する

下から上にどこに行くかを調べ、各横棒について差分

*/

Submission Info

Submission Time
Task C - あみだくじ
User mikecat
Language C23 (GCC 14.2.0)
Score 20
Code Size 1672 Byte
Status AC
Exec Time 21 ms
Memory 3384 KiB

Judge Result

Set Name set01 set02 set03 set04 set05 set06 set07 set08 set09 set10
Score / Max Score 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2 2 / 2
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
set01 data1
set02 data2
set03 data3
set04 data4
set05 data5
set06 data6
set07 data7
set08 data8
set09 data9
set10 data10
Case Name Status Exec Time Memory
data1 AC 1 ms 1636 KiB
data10 AC 21 ms 3384 KiB
data2 AC 0 ms 1660 KiB
data3 AC 0 ms 1596 KiB
data4 AC 0 ms 1848 KiB
data5 AC 1 ms 1724 KiB
data6 AC 1 ms 1876 KiB
data7 AC 2 ms 1888 KiB
data8 AC 4 ms 2016 KiB
data9 AC 11 ms 2456 KiB


2026-02-12 (Thu)
07:32:55 +09:00