#include <bits/stdc++.h> #include "cielib.h" using namespace std; const int D = 505; class prze: public pair<int,int> { public: prze(): prze(0, 0) { } prze(int a,int b) { this->first = a; this->second = b; } int& l() { return this->first; } int& r() { return this->second; } int sfloor() { return (l() + r()) / 2; } int sceil() { return (l() + r() + 1) / 2; } int dlugosc() { return r() - l() + 1; } void obetnij_boki() { int s = sceil(); l() = sfloor(); r() = s; } }; prze wym[D]; vector<int> id; int tab[D]; int wagi[D]; void solve(const int d) { sort(id.begin(), id.end(), [](int a,int b){ if (wym[a].dlugosc() != wym[b].dlugosc()) return wym[a].dlugosc() > wym[b].dlugosc(); return a < b; }); while(true) { int k = 0; while(k + 1 < id.size() && wym[id[k]].dlugosc() < wym[id[k + 1]].dlugosc()) { swap(id[k], id[k+1]); k++; } if (wym[id[0]].dlugosc() == 1) { // printf("odpowiedz! \n"); for (int i = 0; i < d; i++ ) { tab[i] = wym[i].l(); } znalazlem(tab); return; } else { for (int i = 0; i < d; i ++) tab[i] = wym[i].sfloor(); int i = id[0]; // printf("answer %d\n", wym[i].dlugosc()); if (wym[i].dlugosc() == 2) { if (wym[i].l() > 0) wym[i].l() --; else wym[i].r() ++; } tab[i] = wym[i].l(); czyCieplo(tab); tab[i] = wym[i].r(); if (czyCieplo(tab)) { if (wym[i].dlugosc() == 3) wym[i].l() = wym[i].r(); else wym[i].l() = wym[i].sceil(); continue; } tab[i] = wym[i].l(); if (czyCieplo(tab)) { if (wym[i].dlugosc() == 3) wym[i].r() = wym[i].l(); else wym[i].r() = wym[i].sfloor(); continue; } // printf("obetnij boki\n"); wym[i].obetnij_boki(); } } } int main() { int d = podajD(); int k = podajK(); int r = podajR(); for (int i = 0; i < d; i ++) { wym[i] = prze(0, r); id.push_back(i); } solve(d); }
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 96 97 98 99 100 101 102 103 | #include <bits/stdc++.h> #include "cielib.h" using namespace std; const int D = 505; class prze: public pair<int,int> { public: prze(): prze(0, 0) { } prze(int a,int b) { this->first = a; this->second = b; } int& l() { return this->first; } int& r() { return this->second; } int sfloor() { return (l() + r()) / 2; } int sceil() { return (l() + r() + 1) / 2; } int dlugosc() { return r() - l() + 1; } void obetnij_boki() { int s = sceil(); l() = sfloor(); r() = s; } }; prze wym[D]; vector<int> id; int tab[D]; int wagi[D]; void solve(const int d) { sort(id.begin(), id.end(), [](int a,int b){ if (wym[a].dlugosc() != wym[b].dlugosc()) return wym[a].dlugosc() > wym[b].dlugosc(); return a < b; }); while(true) { int k = 0; while(k + 1 < id.size() && wym[id[k]].dlugosc() < wym[id[k + 1]].dlugosc()) { swap(id[k], id[k+1]); k++; } if (wym[id[0]].dlugosc() == 1) { // printf("odpowiedz! \n"); for (int i = 0; i < d; i++ ) { tab[i] = wym[i].l(); } znalazlem(tab); return; } else { for (int i = 0; i < d; i ++) tab[i] = wym[i].sfloor(); int i = id[0]; // printf("answer %d\n", wym[i].dlugosc()); if (wym[i].dlugosc() == 2) { if (wym[i].l() > 0) wym[i].l() --; else wym[i].r() ++; } tab[i] = wym[i].l(); czyCieplo(tab); tab[i] = wym[i].r(); if (czyCieplo(tab)) { if (wym[i].dlugosc() == 3) wym[i].l() = wym[i].r(); else wym[i].l() = wym[i].sceil(); continue; } tab[i] = wym[i].l(); if (czyCieplo(tab)) { if (wym[i].dlugosc() == 3) wym[i].r() = wym[i].l(); else wym[i].r() = wym[i].sfloor(); continue; } // printf("obetnij boki\n"); wym[i].obetnij_boki(); } } } int main() { int d = podajD(); int k = podajK(); int r = podajR(); for (int i = 0; i < d; i ++) { wym[i] = prze(0, r); id.push_back(i); } solve(d); } |