#include #define MAXS 1000 struct U { int z; /*zacatek*/ int k; /*konec*/ int b; /*barva*/ int g; /*group*/ } radky[2][MAXS]; int zasobnik[2*MAXS], ff, // zasobnik volnych skupin, ukazatel na vrchol uf_data[2*MAXS], // datova struktura pro Union-Find size[2*MAXS], // velikost aktualni plochy pro skupinu used[2*MAXS]; // radek posledniho vyskytu skupiny int s, parita, // sirka obrazku sr, ur, // sloupec a usek na zpracovavanem radku url, urlC, // aktivni usek v minulem radku, pocet useku v minulem radku ar=1, max; // aktualni radek, maximalni plocha int uf_find(int e) // nalezne reprezentanta skupiny a zapakuje cestu { int t, r = e; while (uf_data[r]>=0) { r = uf_data[r]; } while (uf_data[e]>=0) { t = uf_data[e]; uf_data[e] = r; e = t; } return r; } int uf_union(int a, int b) // sjednoti skupiny a vrati reprezentanta { if (a != b) { if (uf_data[a] > uf_data[b]) { a ^= b ^= a ^= b; /* XOR swap */ } uf_data[a] += uf_data[b]; // mensi skupinu "zavesime" pod vetsi uf_data[b] = a; size[a] += size[b]; } return a; } void konec_radku() { int i, g; for (i = 0; i < urlC; i++) { g = radky[1-parita][i].g; if (used[g] > 0 && used[g] != ar) { // uvolni nepouzite useky if (uf_data[g] < 0 && size[g] > max) max = size[g]; zasobnik[--ff] = g; used[g] = 0; } } urlC = ur; ur = url = 0; ar++; parita = 1-parita; } void zpracuj(int b, int d, int mult) { int g0, g, k = sr + d - 1; if (d == 0 || mult == 0) return; g0 = g = zasobnik[ff++]; size[g] = d*mult; uf_data[g] = -1; while (url < urlC && sr > radky[1-parita][url].k) url++; while (url < urlC && radky[1-parita][url].z <= k) { if (radky[1-parita][url].b == b) { g = uf_union(g, uf_find(radky[1-parita][url].g)); } // sjednocuje sousedici useky stejne barvy url++; }; if (url) url--; radky[parita][ur].z = sr; radky[parita][ur].k = k; radky[parita][ur].b = b; radky[parita][ur++].g = g; used[g] = ar; if (uf_data[g0] >= 0) ff--; // "zavesena" skupina muze byt uvolnena if (sr + d == s) konec_radku(); } int main() { int d, b, i; for (i = 2*MAXS-1; i>0; i--) zasobnik[i] = i; scanf("%d", &s/*irka*/); while (scanf("%d %d", &d/*elka*/, &b/*arva*/) == 2) { if (s - sr < d) { zpracuj(b, s - sr, 1); // doplni radek do konce d -= s - sr; sr = 0; zpracuj(b, s, d/s); // zpracuje jednobarevne radky d %= s; } zpracuj(b, d, 1); sr += d; } konec_radku(); // dokoncime zpracovani posledniho radku printf("Nejvetsi souvisla plocha jedne barvy: %d\n", max); return 0; }