Pagini recente » Cod sursa (job #1790227) | Cod sursa (job #2522953) | Cod sursa (job #497116) | Cod sursa (job #880891) | Cod sursa (job #3331009)
#include <bits/stdc++.h>
using namespace std;
// Pentru fiecare cameră putem avea cel mult un întrerupător.
struct SwitchInfo {
bool exists = false; // există întrerupător în camera asta?
int t = 0; // timpul de apăsare
int nr = 0; // câte camere modifică
int c[105]; // lista camerelor modificate (nr <= 100)
};
int main() {
ifstream fin("aprindere.in");
ofstream fout("aprindere.out");
int n, m;
fin >> n >> m;
// a[i] = starea becului din camera i (0/1)
int a[1001];
for (int i = 0; i < n; i++) fin >> a[i];
// sw[C] = întrerupătorul din camera C (dacă există)
SwitchInfo sw[1001];
for (int k = 0; k < m; k++) {
int C, T, NRC;
fin >> C >> T >> NRC;
sw[C].exists = true;
sw[C].t = T;
sw[C].nr = NRC;
for (int j = 0; j < NRC; j++) {
fin >> sw[C].c[j];
}
}
long long sum = 0;
// Parcurgem camerele în ordine (0..N-1).
// IMPORTANT: după ce trecem de i, nimic din dreapta nu mai poate modifica camera i.
for (int i = 0; i < n; i++) {
if (!sw[i].exists) {
// În teste există mereu soluție, deci dacă i e 0 acum, înseamnă că a fost
// aprinsă din întrerupătoare anterioare. (Sau era deja 1.)
continue;
}
// Dacă becul din camera i este stins când ajungem aici, trebuie apăsat.
if (a[i] == 0) {
// Apăsăm întrerupătorul: toggle pe toate camerele din lista lui.
for (int j = 0; j < sw[i].nr; j++) {
int room = sw[i].c[j];
a[room] ^= 1; // toggle: 0->1, 1->0
}
sum += sw[i].t;
}
// Dacă a[i] e deja 1, nu apăsăm (altfel l-am stinge și nu îl mai putem repara).
}
fout << sum;
return 0;
}