Cod sursa(job #25399)

Utilizator plastikDan George Filimon plastik Data 4 martie 2007 12:27:28
Problema Balanta Scor 100
Compilator cpp Status done
Runda preONI 2007, Runda 3, Clasa a 10-a Marime 3.38 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <cstring>

const int MAX_N = 1025;
int N, M, Nm, NM;
bool spctm[MAX_N], spctM[MAX_N], one[MAX_N], two[MAX_N];
int pl1[MAX_N], pl2[MAX_N];

int main(void) {
	FILE *in = fopen("balanta.in", "r");
	fscanf(in, "%d %d", &N, &M);
	Nm = NM = N;
	int i, j, len, res;
	for (i = 1; i <= N; ++ i) {
		spctm[i] = spctM[i] = true;
	}
	for (i = 0; i < M; ++ i) {
		memset(one, 0, sizeof(one));
		memset(two, 0, sizeof(two));
		fscanf(in, "%d", &len);
		for (j = 0; j < len; ++ j) {
			fscanf(in, "%d", &pl1[j]);
			one[pl1[j]] = true;
		}
		for (j = 0; j < len; ++ j) {
			fscanf(in, "%d", &pl2[j]);
			two[pl2[j]] = true;
		}
		fscanf(in, "%d", &res);
		if (res == 0) { // pe nici unul din talere nu exista moneda falsa
			for (j = 0; j < len; ++ j) {
				if (spctM[pl1[j]] == true) {
					NM --;
				}
				spctM[pl1[j]] = false;
				if (spctM[pl2[j]] == true) {
					NM --;
				}
				spctM[pl2[j]] = false;
				if (spctm[pl1[j]] == true) {
					Nm --;
				}
				spctm[pl1[j]] = false;
				if (spctm[pl2[j]] == true) {
					Nm --;
				}
				spctm[pl2[j]] = false;
			}
			continue;
		}
		if (res == 1) { // primul taler e mai greu
			for (j = 0; j < len; ++ j) {
				// moneda falsa e mai grea => moneda falsa e pe primul taler
				if (spctM[pl2[j]] == true) {
					NM --;
				}
				spctM[pl2[j]] = false;
				// moneda falsa e mai usoara => moneda falsa e pe al 2-lea taler
				if (spctm[pl1[j]] == true) {
					Nm --;
				}
				spctm[pl1[j]] = false;
			}
			for (j = 1; j <= N; ++ j) {
				// daca o moneda e suspecta, dar nu e pe talerul mai greu, e normala
				if (spctM[j] == true && one[j] == false) {
					spctM[j] = false;
					NM --;
				}
				// o moneda e suspecta dar nu apare pe talerul mai usor
				if (spctm[j] == true && two[j] == false) {
					spctm[j] = false;
					Nm --;
				}
			}
			continue;
		}
		if (res == 2) { // al doilea taler e mai greu
			for (j = 0; j < len; ++ j) {
				// moneda falsa e mai grea => moneda falsa e pe al 2-lea taler
				if (spctM[pl1[j]] == true) {
					NM --;
				}
				spctM[pl1[j]] = false;
				// moneda falsa e mai usoara => moneda falsa e pe primul taler
				if (spctm[pl2[j]] == true) {
					Nm --;
				}
				spctm[pl2[j]] = false;
			}
			for (j = 1; j <= N; ++ j) {
				// daca o moneda e suspecta, dar nu e pe talerul mai greu, e normala
				if (spctM[j] == true && two[j] == false) {
					spctM[j] = false;
					NM --;
				}
				// daca o moneda e suspecta, dar nu e pe talerul mai greu, e normala
				if (spctm[j] == true && one[j] == false) {
					spctm[j] = false;
					Nm --;
				}
			}
		}
	}
	fclose(in);

	FILE *out = fopen("balanta.out", "w");
	if (Nm == 0 && NM == 0) {
		fprintf(out, "0\n"); 
		fclose(out);
		return 0;
	}
	if (NM == 1 && Nm == 1) {
		for (i = 1; i <= N; ++ i) {
			if (spctm[i] == true && spctM[i] == true) {
				fprintf(out, "%d\n", i);
				fclose(out);
				return 0;
			}
		}
		fprintf(out, "0\n"); 
		fclose(out);
		return 0;
	}
	if (Nm == 1) {
		for (i = 1; i <= N; ++ i) {
			if (spctm[i] == true) {
				fprintf(out, "%d\n", i);
				fclose(out);
				return 0;
			}
		}
	} 
	if (NM == 1) {
		for (i = 1; i <= N; ++ i) {
			if (spctM[i] == true) {
				fprintf(out, "%d\n", i);
				fclose(out);
				return 0;
			}
		}
	}
	fprintf(out, "0\n"); 
	fclose(out);

	return 0;
}