Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Zadatak: Zone
- http://bit.ly/zadatak-zone
- Datum: 2014-01-11
- Autor: HSIN
- Ponuđeno rješenje: Kristijan Burnik, udruga informatičara Božo Težak
- Gmail: kristijanburnik
- */
- #include <iostream>
- #include <cstdio>
- using namespace std;
- enum Stranica { SZ = 0, SI = 1, JI = 2, JZ = 3};
- enum Interval { POC, KRAJ };
- string strane = "SIJZ";
- // prva dva su za brisanje dodirnih tocaka, druga dva su za dodavanje novih dodirnih tocaka
- int utjecaj [4][4] = { {SZ,SI,JZ,JI}, {SI,JI,JZ,SZ}, {JZ,JI,SZ,SI}, {JZ,SZ,JI,SI} };
- // sva cetri ruba pripadaju prvom kvadratu (rombu) pa su inicijalno intervali [0,0] za sve 4 strane
- int rubovi[4][2];
- // rezultati:
- int cijena[300000];
- int main()
- {
- int n;
- cin >> n;
- for (int i = 1; i < n; i++)
- {
- char strana;
- cin >> strana;
- // index strane svijeta na koju postavljamo novu zonu
- int str = strane.find( strana );
- // brisanje i brojanje
- int poc = 3000000, kraj = -1;
- // obradjujemo sve utjecane rubove
- for (int j = 0; j < 2; j++)
- {
- int p = utjecaj[str][j];
- // trazimo interval zona na koje utjece novododana zona
- poc = min( poc , rubovi[p][POC] );
- kraj = max( kraj , rubovi[p][KRAJ] );
- // brisanje starih zona i dodavanje nove
- rubovi[p][POC] = rubovi[p][KRAJ] = i;
- }
- // nadopuni cijene za prijasnje zone
- for (int k = poc; k <= kraj; k++ )
- cijena[k]++;
- // nadopuni cijenu za novu zonu
- cijena[i] += ( kraj - poc + 1 );
- // dodavanje nove zone na "vanjske" rubove
- for (int j = 2; j < 4; j++)
- rubovi[ utjecaj[str][j] ][KRAJ] = i;
- }
- for (int i = 0 ; i < n; i++)
- printf("%d\n",cijena[i]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement