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 `#include #include "cielib.h" using namespace std; const int MAXD = 501; int P[MAXD]; pair D[MAXD]; void solve1() { while(D[0].first < D[0].second) { int m = (D[0].first + D[0].second + 1) / 2; int prev = P[0]; P[0] = D[0].second; if(czyCieplo(P)) { D[0].first = m; P[0] = m; } else { P[0] = D[0].first; if(D[0].first + 1 == D[0].second) --m; D[0].second = m; } czyCieplo(P); } } void find(int d, int &idx) { for(int i=0; i= D[idx].second) ++idx; return; } void solve(int d) { czyCieplo(P); if(d==1) { solve1(); return; } bool b = true; while(b) { int idx=-1, dx=0; find(d, idx); int m = (D[idx].first + D[idx].second + 1) / 2; int prev = P[idx]; P[idx] = D[idx].second; if(czyCieplo(P)) { D[idx].first = m; P[idx] = m; } else { P[idx] = D[idx].first; if(D[idx].first + 1 == D[idx].second) --m; D[idx].second = m; } czyCieplo(P); b = false; for(int i=0; i