====== AISD: pracownia C ====== *{{:aisd:10.pracownia-c.pdf|Pracownia C}}. ===== Testy ===== *{{:aisd:testy:testy-c.tar.bz2|Testy}} - testy jawne, test maksymalny. ===== Wyniki ===== http://www.ii.uni.wroc.pl/~mbi/dyd/aisd_10s/wyniki_C.html 0 oznacza brak poprawnej odpowiedzi na jakiś test pierwsza kolumna to suma czasów 0: Adr Dyli 0: And Kaje 0: Ani Stoz 0: Dam Wiec 0: Grz Kurd 0: Jad Gruc 0: Jak Sliw 0: Kam Shai 0: Luk Toma 0: Mac Wiec 0: Mar Mach 0: Mic Roza 0: Mic Soko 0: Mik Ziem 0: Pat Urba 0: Paw Kime 0: Pio Posa 0: Sla Step 0: m m (test) 472: bi ff (test) 536: Mik Kali 672: Kon Wypy 708: Pio Walk (test) 724: Jak Tarn 748: Ale Bali 752: Daw Ryzn 776: Pio Gajo 780: Paw Kacp 780: Pio Walk 784: Dom Rusa 784: Kam Miel 800: Pio Rzep 820: Mar Kacz 832: Mac Maty 840: Dom Rogo 852: Mic Karp 856: Mar Ocze 860: Ada Kacz 860: Kac Krol 888: Bla Sala 928: Krz Ziel 944: Krz Nowi 960: Mar Janc 972: Mat Naha (test) 980: Ada Wyzg 988: Mac Pacu 1008: Mat Naha 1020: Paw Kici 1068: Luk Zapa 1108: Paw Kali 1128: Mic Mazu 1144: Wik Jana 1220: Mar Kowa 1236: Tom Losz (test) 1260: Iza Bicz 1304: Dan Blas 1304: Fil Slom 1332: Tom Losz 1376: Krz Kusi 1412: Pat Obar 1436: Ada Czar 1440: Luk Syno 1460: Are Flin 1496: Pio Bzow 1524: Luc Fran 1588: Mal Jurk 1748: Mag Sara 1776: Daw Jurc 1864: Grz Chud 1896: Mac Maty (test) 1948: Dam Rusa 1992: Pio Ryba 2184: Mar Kola 2192: Mar Janu 2200: Kor Wegr 2220: Dom Brul 2272: Pio Krze 2388: Dam Stra 2460: Krz Parj 2532: Krz Ziel (test) 2544: Nha Nguy 2588: Wal Augu (test) 2692: Paw Muri 2752: Joa Bieg 2904: Paw Gawr (test) 2908: Kar Kona 3020: Pio Pole 3032: Ale Gali 3276: Szy Lasz 3344: Raf Luka 3460: Dam Piat 3720: Mic Glen 3964: Raf Kowa 4132: Bar Krok 4260: Daw Cies 4352: Ada Kija 4888: Luk Wrza ===== Rozwiązanie (biff) ===== #include #define MAX_SIZE 27000 typedef unsigned long long priority; unsigned short size; unsigned M, k, pushed_col; struct Product { priority prio; unsigned x; unsigned y; } elems[MAX_SIZE]; #define L(n) ((n)<<1) #define R(n) (((n)<<1)+1) #define UP(n) ((n)>>1) #define TOP (elems[0]) void heapify (unsigned short i) { rec: unsigned short bot = i; if (R (i) < size) { if (elems[R (i)].prio >= elems[i].prio) bot = (elems[L (i)].prio >= elems[R (i)].prio) ? L(i) : R(i); else if (elems[L (i)].prio >= elems[bot].prio) bot = L (i); else return; } else if (L (i) == size - 1 && elems[L (i)].prio >= elems[bot].prio) bot = L (i); else return; if (bot != i) // TODO: niepotrzebne { Product tmp = elems[bot]; elems[bot] = elems[i]; elems[i] = tmp; i = bot; goto rec; } } inline void push (Product elem) { unsigned short i = size; size += 1; // TODO: zmienic na switcha while ((i > 0) && elem.prio >= elems[UP (i)].prio) { elems[i] = elems[UP (i)]; i = UP (i); } elems[i] = elem; } inline Product pop () { // assert(!HEAP_ISEMPTY(*h)); Product max = elems[0]; elems[0] = elems[--size]; heapify (0); return max; } priority next () { Product p = TOP; priority xy = (priority) p.prio; unsigned mincol = p.x + p.y - 1; // zdejmij wszystkie o największym prioritecie while (size != 0 && TOP.prio == xy) { p = TOP; if (p.x + p.y < mincol) mincol = p.x + p.y - 1; (void) pop (); } // włóż kolejną przekątną if (mincol < pushed_col && mincol != 1) { unsigned x, y; pushed_col = mincol; x = mincol >> 1; y = x + (mincol % 2); priority xy1 = (priority) x * y; if (y <= M) { push ((Product) { xy1, x, y}); while (y < M) { xy1 = xy1 + x - y - 1; x--; y++; if (xy1 < xy) // tylko mniejsze push ((Product) { xy1, x, y}); else break; } } } return xy; } int main () { setvbuf (stdout, NULL, _IOFBF, 2 >> 15); char ch; while ((ch = getchar_unlocked ()) >= '0') M = M * 10 + (ch - '0'); while ((ch = getchar_unlocked ()) >= '0') k = k * 10 + (ch - '0'); push ((Product) { (priority) M * M, M, M}); pushed_col = M + M; unsigned len; char out[14]; out[13] = '\0'; out[12] = '\n'; unsigned long p1; priority p; while (k --> 0) { len = 11; p = next (); out[len--] = (p % 10) + '0'; p1 = p / 10; // div dla ul jest szybsze niz dla ull while (p1 > 0) { out[len--] = (p1 % 10) + '0'; p1 = p1 / 10; } fputs_unlocked (out + len + 1, stdout); } }