#include <cstdio> #include <algorithm> #include "cielib.h" int R; int find_left(int pocz, int kon, int tab[], int pos) { tab[pos] = pocz+1; czyCieplo(tab); int temp = pocz; while (pocz < kon-2) { int sr = (temp+kon)/2; tab[pos] = sr; if (czyCieplo(tab)) { tab[pos] = sr+1; if (sr+1 > R && czyCieplo(tab)) { pocz = sr; temp = sr; if ((temp+kon)/2 == sr+1) { tab[pos] = sr; czyCieplo(tab); } } else { tab[pos] = pocz; czyCieplo(tab); temp = pocz; kon = sr+1; } } else { tab[pos] = pocz; czyCieplo(tab); temp = pocz; kon = sr; } } return pocz+1; } int find_right(int pocz, int kon, int tab[], int pos) { kon--; tab[pos] = kon; czyCieplo(tab); int sr; int temp = kon; while (pocz < kon-1) { sr = (pocz+temp)/2; tab[pos] = sr; if (czyCieplo(tab)) { kon = temp; temp = sr; } else { pocz = temp; temp = kon; tab[pos] = kon; czyCieplo(tab); } } return pocz; } bool rozwiazany[500]; std::pair<int,int> ostatnie[500]; int main() { int D = podajD(); int K = podajK(); R = podajR(); int rozwiazano = 0; int tab[D]; srand((unsigned int)(1337+D+R+K)); for (int i = 0;i < D;i++) { ostatnie[i] = {-1, R+1}; tab[i] = rand()%(R+1); } czyCieplo(tab); int ostatni = -1; while (rozwiazano != D) { int q = rand()%D; if (rozwiazany[q] || ostatni == q) continue; int l = find_left(-1, R+1, tab, q); int r = find_right(l-1, R+1, tab, q); ostatnie[q] = {l-1, r+1}; if (l > 0 && r < R || l == r) { rozwiazany[q] = true; rozwiazano++; tab[q] = (l+r)/2; } else { tab[q] = (l+r+rand()%2)/2; } ostatni = q; } znalazlem(tab); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <cstdio> #include <algorithm> #include "cielib.h" int R; int find_left(int pocz, int kon, int tab[], int pos) { tab[pos] = pocz+1; czyCieplo(tab); int temp = pocz; while (pocz < kon-2) { int sr = (temp+kon)/2; tab[pos] = sr; if (czyCieplo(tab)) { tab[pos] = sr+1; if (sr+1 > R && czyCieplo(tab)) { pocz = sr; temp = sr; if ((temp+kon)/2 == sr+1) { tab[pos] = sr; czyCieplo(tab); } } else { tab[pos] = pocz; czyCieplo(tab); temp = pocz; kon = sr+1; } } else { tab[pos] = pocz; czyCieplo(tab); temp = pocz; kon = sr; } } return pocz+1; } int find_right(int pocz, int kon, int tab[], int pos) { kon--; tab[pos] = kon; czyCieplo(tab); int sr; int temp = kon; while (pocz < kon-1) { sr = (pocz+temp)/2; tab[pos] = sr; if (czyCieplo(tab)) { kon = temp; temp = sr; } else { pocz = temp; temp = kon; tab[pos] = kon; czyCieplo(tab); } } return pocz; } bool rozwiazany[500]; std::pair<int,int> ostatnie[500]; int main() { int D = podajD(); int K = podajK(); R = podajR(); int rozwiazano = 0; int tab[D]; srand((unsigned int)(1337+D+R+K)); for (int i = 0;i < D;i++) { ostatnie[i] = {-1, R+1}; tab[i] = rand()%(R+1); } czyCieplo(tab); int ostatni = -1; while (rozwiazano != D) { int q = rand()%D; if (rozwiazany[q] || ostatni == q) continue; int l = find_left(-1, R+1, tab, q); int r = find_right(l-1, R+1, tab, q); ostatnie[q] = {l-1, r+1}; if (l > 0 && r < R || l == r) { rozwiazany[q] = true; rozwiazano++; tab[q] = (l+r)/2; } else { tab[q] = (l+r+rand()%2)/2; } ostatni = q; } znalazlem(tab); return 0; } |