結果

問題 No.3093 Safe Infection
ユーザー 👑 ygussany
提出日時 2025-03-09 13:48:12
言語 C
(gcc 13.3.0)
結果
RE  
実行時間 -
コード長 2,563 bytes
コンパイル時間 1,558 ms
コンパイル使用メモリ 29,560 KB
実行使用メモリ 8,608 KB
最終ジャッジ日時 2025-03-09 13:48:29
合計ジャッジ時間 16,939 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other RE * 70
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.c: In function ‘main’:
main.c:71:9: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   71 |         scanf("%d %d %d", &N, &M, &K);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.c:72:34: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   72 |         for (i = 1; i <= N; i++) scanf("%d", &(A[i]));
      |                                  ^~~~~~~~~~~~~~~~~~~~
main.c:74:17: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   74 |                 scanf("%d %d", &u, &w);
      |                 ^~~~~~~~~~~~~~~~~~~~~~

ソースコード

diff #

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

typedef struct Edge {
	struct Edge *next;
	int v;
} edge;

typedef struct {
	int key, id;
} data;

void merge_sort(int n, data x[])
{
	static data y[100001] = {};
	if (n <= 1) return;
	merge_sort(n / 2, &(x[0]));
	merge_sort((n + 1) / 2, &(x[n/2]));
	
	int i, p, q;
	for (i = 0, p = 0, q = n / 2; i < n; i++) {
		if (p >= n / 2) y[i] = x[q++];
		else if (q >= n) y[i] = x[p++];
		else y[i] = (x[p].key < x[q].key)? x[p++]: x[q++];
	}
	for (i = 0; i < n; i++) x[i] = y[i];
}

typedef struct {
	int *par, *size;
} UF_forest;

void UF_init(UF_forest *F, int n)
{
	int i;
	F->par = (int*)malloc(sizeof(int) * (n + 1));
	F->size = (int*)malloc(sizeof(int) * (n + 1));
	for (i = 1; i <= n; i++) {
		F->par[i] = i;
		F->size[i] = 1;
	}
}

int UF_root(UF_forest *F, int v)
{
	if (F->par[v] == v) return v;
	else {
		F->par[v] = UF_root(F, F->par[v]);
		return F->par[v];
	}
}

void UF_merge(UF_forest *F, int u, int v)
{
	u = UF_root(F, u);
	v = UF_root(F, v);
	if (u == v) return;
	else if (F->size[u] > F->size[v]) {
		F->par[v] = u;
		F->size[u] += F->size[v];
	} else {
		F->par[u] = v;
		F->size[v] += F->size[u];
	}
}

int main()
{
	int i, N, M, K, A[100001], u, w;
	edge *adj[100001] = {}, e[200001], *p, *pp;
	scanf("%d %d %d", &N, &M, &K);
	for (i = 1; i <= N; i++) scanf("%d", &(A[i]));
	for (i = 0; i < M; i++) {
		scanf("%d %d", &u, &w);
		e[i*2].v = w;
		e[i*2].next = adj[u];
		adj[u] = &(e[i*2]);
		e[i*2+1].v = u;
		e[i*2+1].next = adj[w];
		adj[w] = &(e[i*2+1]);
	}
	
	data d[100001];
	for (i = 1; i <= N; i++) {
		d[i-1].key = A[i];
		d[i-1].id = i;
	}
	merge_sort(N, d);
	
	int x;
	UF_forest F;
	UF_init(&F, N);
	for (i = 0; i < N; i++) {
		u = UF_root(&F, d[i].id);
		for (p = adj[u]; p != NULL; p = p->next) {
			w = UF_root(&F, p->v);
			if (w != u && A[w] >= A[u] && A[w] <= A[u] + K) {
				UF_merge(&F, u, w);
				x = UF_root(&F, u);
				if (x == w) {
					u ^= w;
					w ^= u;
					u ^= w;
				}
				if (A[u] < A[w]) A[u] = A[w];
				for (p = adj[u], pp = adj[w]; p->next != NULL && pp->next != NULL; p = p->next, pp = pp->next) {
					while (p->next != NULL && UF_root(&F, p->next->v) == u) p->next = p->next->next;
					while (pp->next != NULL && UF_root(&F, pp->next->v) == u) pp->next = pp->next->next;
				}
				if (p->next == NULL) p->next = adj[w];
				else {
					pp->next = adj[u];
					adj[u] = adj[w];
				}
				break;
			}
			
		}
	}
	for (u = 1; u <= N; u++) if (UF_root(&F, u) == u && A[u] != d[N-1].key) break;
	if (u > N) printf("Yes\n");
	else printf("No\n");
	fflush(stdout);
	return 0;
}
0