#include int main (void) { int k, K; int n, m; int i, j; int t, T; int D; int c[1001], s[1001]; int nmt[1001]; char alive[1001], mover[1001]; int shell[1001], occupant[1001]; int prefer[1001], preferred[1001]; FILE *in = fopen ("crabs.in", "r"); fscanf (in, "%d\n", &K); for (k = 1; k <= K; k ++) { fscanf (in, "%d %d %d %d\n", &n, &m, &D, &T); for (i = 1; i <= n; i ++) { fscanf (in, "%d\n", &c[i]); alive[i] = 1; shell[i] = i; } for (j = 1; j <= m; j ++) { fscanf (in, "%d\n", &s[j]); if (j <= n) occupant[j] = j; else occupant[j] = 0; } t = 0; while (t < T) { t = T + 1; for (i = 1; i <= n; i ++) if (alive[i]) { nmt[i] = s[shell[i]] - c[i]; if (nmt[i] < t) t = nmt[i]; } if (t < T) { for (i = 1; i <= n; i ++) // all crabs move out if (alive[i] && nmt[i] == t) { mover[i] = 1; occupant[shell[i]] = 0; } else mover[i] = 0; for (i = 1; i <= n; i ++) // find preferred free new house for all if (mover[i]) { prefer[i] = 0; for (j = 1; j <= m; j ++) if (!occupant[j] && s[j]-D <= c[i] + t && c[i] + t < s[j] && j != shell[i] && (prefer[i] == 0 || s[j] > s[prefer[i]])) prefer[i] = j; } for (j = 1; j <= m; j ++) preferred[j] = 0; for (i = 1; i <= n; i ++) // resolve all disputes if (mover[i]) { j = prefer[i]; if (j != 0) { if (!preferred[j]) preferred[j] = i; else if (c[preferred[j]] > c[i]) alive[i] = 0; else { alive[preferred[j]] = 0; preferred[j] = i; } } else alive[i] = 0; } for (i = 1; i <= n; i ++) // survivors move into their houses if (mover[i]) { shell[i] = prefer[i]; occupant[shell[i]] = i; } } } printf ("Data Set %d:\n", k); for (i = 1; i <= n; i ++) if (alive[i]) printf ("%d\n", i); printf ("\n"); } fclose (in); return 0; }