//Jacek Zlydach (38, or sth like that) //Megalopolis w wersji z gosiami ^^ //Wersja 1.2, podobno zoptymalizowana //Organizatorom OI dziekuje za paczki - wreszcie udalo mi sie dzis jakies skonsumowac :) #include #include typedef unsigned int uint32; typedef signed int sint32; typedef unsigned char uint8; class OdnalazlamSiebieWTobie; //forward declaration typedef std::pair NiePotrafieCieZapomniec; //czyli droga; skladowe: wioska docelowa, stan (true == autostrada) class OdnalazlamSiebieWTobie //czyli wioska { public: std::vector zatrzymamCie; //w pamieci mej :) - lista sasiedztwa OdnalazlamSiebieWTobie() {} }; OdnalazlamSiebieWTobie nowyDzien[250001]; //tablica wiosek uint32 zmienia = 0; //liczba wypraw Bajtazara uint32 zyciaBieg = 0; //liczba wiosek uint32 tuNaZawsze = 0; //total, uzywane w DFSie inline bool DoDFS(uint32 startWith, uint32 sumSoFar) { // std::printf("DoDFS() - w wiosce %u, jak dotad %u polnych drog!\n", startWith, sumSoFar); if(startWith == 1) { tuNaZawsze = sumSoFar; // std::printf("We've hit the motherload!\n"); return true; } for(uint32 i = 0 ; i < nowyDzien[startWith].zatrzymamCie.size() ; ++i) { // printf("\tpetla, element %u ma wartosc %u\n", i, nowyDzien[startWith].zatrzymamCie[i].first); if(nowyDzien[startWith].zatrzymamCie[i].second == false) { ++sumSoFar; } if(DoDFS(nowyDzien[startWith].zatrzymamCie[i].first, sumSoFar)) { return true; } } return false; } inline void TakTrudnoJest(uint32 from, uint32 to) //autostraduj { for(uint32 i = 0 ; i < nowyDzien[from].zatrzymamCie.size() ; ++i) { if(nowyDzien[from].zatrzymamCie[i].first == to) { nowyDzien[from].zatrzymamCie[i].second = true; // std::printf("zaautostradowalismy %u -> %u\n", from, to); return; } } // std::printf("ojej! droga %u -> %u nie istnieje?!?\n",from,to); return; } inline void Slowa() //przetworz wejscie { uint32 gosia, andrzejewicz; //jakies temporary variables uint8 jest, pr0; std::scanf("%u", &zyciaBieg); // std::printf("wczytano %d wiosek\n", zyciaBieg); for(uint32 i = 0 ; i < zyciaBieg-1 ; ++i) { std::scanf("%u %u", &gosia, &andrzejewicz); // std::printf("do wiekszej wioski(%u) dodaje mniejsza gosie(%u) ;)\n", andrzejewicz, gosia); nowyDzien[andrzejewicz].zatrzymamCie.push_back(NiePotrafieCieZapomniec(gosia, false)); } std::scanf("%u", &zmienia); // std::printf("wczytano %d eventow!\n", zmienia); for(uint32 j = 0 ; j < zmienia+zyciaBieg -1 ; ++j) { std::scanf("%c", &jest); //usuwamy '\n' std::scanf("%c", &jest); if(jest == 'W') { std::scanf("%u", &gosia); if(gosia == 1) { // printf("spacerek po parku nie wymaga korzystania z polnych drog ;) - 0\n"); printf("0\n"); } else { // std::printf("wyprawa do %u\n", gosia); DoDFS(gosia,0); // std::printf("a drog jest %u\n", tuNaZawsze); std::printf("%u\n", tuNaZawsze); } } else { std::scanf("%u %u", &gosia, &andrzejewicz); // std::printf("%u <-> %u staje sie autostrada!\n", gosia, andrzejewicz); TakTrudnoJest(andrzejewicz, gosia); } } } int main() { Slowa(); return 0; } //kup mi prosze ktos SoundBlaster Live!, bo mi sie spalil Realtek na plycie... //A tak w ogole, to "SZUKAM SPONSORA!"