Submission #64847065


Source Code Expand

Copy
#include <stdio.h>
#include <stdlib.h>
struct pair_s {
int a, b;
int idx;
};
int cmp(const void* x, const void* y) {
struct pair_s a = *(const struct pair_s*)x, b = *(const struct pair_s*)y;
if (a.a != b.a) return a.a < b.a ? -1 : 1;
if (a.b != b.b) return a.b < b.b ? -1 : 1;
return a.idx < b.idx ? -1 : a.idx > b.idx;
}
int A[212345 * 2];
struct pair_s pairs[212345 * 2];
int ng[212345];
int main(void) {
int T, tc;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <stdlib.h>

struct pair_s {
	int a, b;
	int idx;
};

int cmp(const void* x, const void* y) {
	struct pair_s a = *(const struct pair_s*)x, b = *(const struct pair_s*)y;
	if (a.a != b.a) return a.a < b.a ? -1 : 1;
	if (a.b != b.b) return a.b < b.b ? -1 : 1;
	return a.idx < b.idx ? -1 : a.idx > b.idx;
}

int A[212345 * 2];
struct pair_s pairs[212345 * 2];
int ng[212345];

int main(void) {
	int T, tc;
	if (scanf("%d", &T) != 1) return 1;
	for (tc = 1; tc <= T; tc++) {
		int N;
		int i;
		int ans = 0;
		if (scanf("%d", &N) != 1) return 1;
		for (i = 0; i < 2 * N; i++) {
			if (scanf("%d", &A[i]) != 1) return 1;
		}
		for (i = 1; i < 2 * N; i++) {
			if (A[i - 1] <= A[i]) {
				pairs[i - 1].a = A[i - 1];
				pairs[i - 1].b = A[i];
			} else {
				pairs[i - 1].a = A[i];
				pairs[i - 1].b = A[i - 1];
			}
			pairs[i - 1].idx = i - 1;
			if (A[i - 1] == A[i]) ng[A[i]] = tc;
		}
		qsort(pairs, 2 * N - 1, sizeof(*pairs), cmp);
		for (i = 1; i < 2 * N - 1; i++) {
			if (
				ng[pairs[i].a] != tc &&
				ng[pairs[i].b] != tc &&
				pairs[i - 1].a == pairs[i].a &&
				pairs[i - 1].b == pairs[i].b &&
				(
					pairs[i - 1].idx < pairs[i].idx - 1 ||
					(
						i > 1 &&
						pairs[i - 2].a == pairs[i].a &&
						pairs[i - 2].b == pairs[i].b &&
						pairs[i - 2].idx < pairs[i].idx - 1
					)
				)
			) {
				ans++;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}

/*

隣接している数値はアウト
それ以外で、隣同士で順不同 (すなわち、小さい方を先に正規化) のペアを取り出して、
同じペアが2個あればおk
↑嘘 2 1 2 x x x x x 1 みたいなので死ぬ

「ソートして隣接した要素の位置が2以上離れていればおk」だと、1 2 1 2 みたいなやつで死ぬ
なぜなら、同じペアが3個検出され、1ずつしか離れていないことになる

隣接している数値は1ペアしか出てこないので、特別扱いで弾かなくておk
↑大嘘 2 1 1 2 みたいなやつで引っかかる
↑大嘘ってほどでもない ペアから外す必要はない 別のフラグで管理する

*/

Submission Info

Submission Time
Task D - Switch Seats
User mikecat
Language C (gcc 12.2.0)
Score 400
Code Size 2211 Byte
Status AC
Exec Time 103 ms
Memory 12388 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 1
AC × 19
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 01_small_06.txt, 02_random_1_00.txt, 02_random_1_01.txt, 02_random_1_02.txt, 02_random_1_03.txt, 02_random_1_04.txt, 03_random_2_00.txt, 03_random_2_01.txt, 03_random_2_02.txt, 04_max_00.txt, 05_corner_00.txt, 05_corner_01.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 1628 KB
01_small_00.txt AC 34 ms 1568 KB
01_small_01.txt AC 34 ms 1712 KB
01_small_02.txt AC 41 ms 1592 KB
01_small_03.txt AC 43 ms 1596 KB
01_small_04.txt AC 42 ms 1580 KB
01_small_05.txt AC 42 ms 1736 KB
01_small_06.txt AC 42 ms 1732 KB
02_random_1_00.txt AC 103 ms 12388 KB
02_random_1_01.txt AC 102 ms 12244 KB
02_random_1_02.txt AC 103 ms 12348 KB
02_random_1_03.txt AC 103 ms 12360 KB
02_random_1_04.txt AC 103 ms 12316 KB
03_random_2_00.txt AC 102 ms 12320 KB
03_random_2_01.txt AC 103 ms 12356 KB
03_random_2_02.txt AC 102 ms 12352 KB
04_max_00.txt AC 51 ms 12340 KB
05_corner_00.txt AC 48 ms 10764 KB
05_corner_01.txt AC 50 ms 10740 KB


2025-04-14 (Mon)
20:03:46 +09:00