Submission #73265153


Source Code Expand

Copy
#include <stdio.h>
#include <stdlib.h>
struct card_s {
int start, num;
struct card_s* next;
};
struct cardinfo_s {
struct card_s *first, *last;
};
struct carddivide_s {
struct cardinfo_s a, b, c;
};
struct card_s* createCard(int start, int num) {
struct card_s* card = malloc(sizeof(*card));
if (card == NULL) exit(2);
card->start = start;
card->num = num;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>
#include <stdlib.h>

struct card_s {
	int start, num;
	struct card_s* next;
};

struct cardinfo_s {
	struct card_s *first, *last;
};

struct carddivide_s {
	struct cardinfo_s a, b, c;
};

struct card_s* createCard(int start, int num) {
	struct card_s* card = malloc(sizeof(*card));
	if (card == NULL) exit(2);
	card->start = start;
	card->num = num;
	card->next = NULL;
	return card;
}

void divide2(struct cardinfo_s* a, struct cardinfo_s* b, struct card_s* cards, int x) {
	struct card_s** prev, *prevSrc = NULL;
	a->first = cards;
	a->last = NULL;
	b->first = NULL;
	b->last = NULL;
	prev = &a->first;
	while (*prev != NULL) {
		if ((*prev)->num <= x) {
			x -= (*prev)->num;
			prevSrc = *prev;
			prev = &(*prev)->next;
		} else if (x == 0) {
			a->last = prevSrc;
			if (prevSrc == NULL) a->first = NULL;
			b->first = *prev;
			if (a->last != NULL) a->last->next = NULL;
			break;
		} else {
			struct card_s* newNode1 = createCard((*prev)->start, x);
			struct card_s* newNode2 = createCard((*prev)->start + x, (*prev)->num - x);
			newNode2->next = (*prev)->next;
			free(*prev);
			*prev = newNode1;
			a->last = newNode1;
			b->first = newNode2;
			break;
		}
	}
	b->last = b->first;
	if (b->last != NULL) {
		while (b->last->next != NULL) b->last = b->last->next;
	}
}

struct carddivide_s divide(struct card_s* cards, int x, int y) {
	struct carddivide_s result;
	if (x == 0) {
		result.a.first = NULL;
		result.a.last = NULL;
		divide2(&result.b, &result.c, cards, y);
	} else {
		divide2(&result.a, &result.b, cards, x);
		divide2(&result.b, &result.c, result.b.first, y - x);
	}
	return result;
}

int n;
int m;
int p, q, r;
int x[5123], y[5123];

int main(void) {
	int i;
	struct card_s* cards;
	struct carddivide_s finalCards;
	int ans = 0;
	if (scanf("%d", &n) != 1) return 1;
	if (scanf("%d", &m) != 1) return 1;
	if (scanf("%d%d%d", &p, &q, &r) != 3) return 1;
	for (i = 0; i < m; i++) {
		if (scanf("%d%d", &x[i], &y[i]) != 2) return 1;
	}
	cards = createCard(1, n);
	for (i = 0; i < m; i++) {
		struct carddivide_s splitted = divide(cards, x[i], y[i]);
		splitted.c.last->next = splitted.b.first;
		splitted.b.last->next = splitted.a.first;
		cards = splitted.c.first;
	}
	finalCards = divide(cards, p - 1, q);
	for (cards = finalCards.b.first; cards != NULL; cards = cards->next) {
		if (cards->start <= r) {
			int num = cards->num;
			int num2 = r - cards->start + 1;
			ans += num <= num2 ? num : num2;
		}
	}
	printf("%d\n", ans);
	return 0;
}

Submission Info

Submission Time
Task E - シャッフル
User mikecat
Language C23 (GCC 14.2.0)
Score 100
Code Size 2598 Byte
Status AC
Exec Time 121 ms
Memory 1920 KiB

Judge Result

Set Name set01 set02 set03 set04 set05
Score / Max Score 20 / 20 20 / 20 20 / 20 20 / 20 20 / 20
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
Set Name Test Cases
set01 data1
set02 data2
set03 data3
set04 data4
set05 data5
Case Name Status Exec Time Memory
data1 AC 1 ms 1712 KiB
data2 AC 1 ms 1664 KiB
data3 AC 116 ms 1756 KiB
data4 AC 118 ms 1920 KiB
data5 AC 121 ms 1760 KiB


2026-02-13 (Fri)
22:05:22 +09:00