#include "cielib.h"
#include <vector>
#include <set>
#include <algorithm>
std::vector<int> add(const std::vector<int> &a, const std::vector<int> &b)
{
std::vector<int> c = a;
for (int i=0;i<c.size();++i)
c[i] += b[i];
return c;
}
std::vector<int> add(const std::vector<int> &a, const std::vector<int> &b, int k)
{
std::vector<int> c = a;
for (int i=0;i<c.size();++i)
c[i] += b[i] * k;
return c;
}
int main()
{
int D = podajD();
int R = podajR();
int maxR = 0;
std::vector<int> dir(D,0);
std::vector<int> pos(D,0);
std::set<int> dim;
for (int i=0;i<D;++i)
dim.insert(i);
while (!dim.empty())
{
int dd = -1;
std::set<int> dim2 = dim;
while (!dim2.empty())
{
std::set<int> dim3;
int N = dim2.size()/2;
for (int i=0;i<N;++i)
{
dim3.insert(*dim2.begin());
dim2.erase(dim2.begin());
}
auto pos2 = add(pos, dir);
for (int d : dim2)
pos2[d] = 1;
czyCieplo(pos.data());
if (czyCieplo(pos2.data()) == 1)
{
if (dim2.size() == 1)
{
dd = *dim2.begin();
break;
}
}
else
dim2 = dim3;
}
if (dd == -1)
{
bool any = false;
for (int d : dim)
{
czyCieplo(pos.data());
auto pos2 = add(pos, dir, 1);
pos2[d] += 1;
if (czyCieplo(pos2.data()) == 1)
{
dir[d] = 1;
any = true;
}
}
if (!any)
dir = std::vector<int>(D,1);
dim.clear();
}
else
{
dim.erase(dd);
dir[dd] = 1;
}
int l = 0;
int r = R-maxR;
while (l<r)
{
int s = (l+r)/2;
auto pos2 = add(pos, dir, s);
auto pos3 = add(pos2, dir);
czyCieplo(pos2.data());
if (czyCieplo(pos3.data()) == 1)
l = s+1;
else
r = s;
}
pos = add(pos, dir, l);
for (int d=0;d<D;++d)
maxR = std::max(maxR, pos[d]);
}
znalazlem(pos.data());
}
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 104 105 106 107 108 109 110 | #include "cielib.h" #include <vector> #include <set> #include <algorithm> std::vector<int> add(const std::vector<int> &a, const std::vector<int> &b) { std::vector<int> c = a; for (int i=0;i<c.size();++i) c[i] += b[i]; return c; } std::vector<int> add(const std::vector<int> &a, const std::vector<int> &b, int k) { std::vector<int> c = a; for (int i=0;i<c.size();++i) c[i] += b[i] * k; return c; } int main() { int D = podajD(); int R = podajR(); int maxR = 0; std::vector<int> dir(D,0); std::vector<int> pos(D,0); std::set<int> dim; for (int i=0;i<D;++i) dim.insert(i); while (!dim.empty()) { int dd = -1; std::set<int> dim2 = dim; while (!dim2.empty()) { std::set<int> dim3; int N = dim2.size()/2; for (int i=0;i<N;++i) { dim3.insert(*dim2.begin()); dim2.erase(dim2.begin()); } auto pos2 = add(pos, dir); for (int d : dim2) pos2[d] = 1; czyCieplo(pos.data()); if (czyCieplo(pos2.data()) == 1) { if (dim2.size() == 1) { dd = *dim2.begin(); break; } } else dim2 = dim3; } if (dd == -1) { bool any = false; for (int d : dim) { czyCieplo(pos.data()); auto pos2 = add(pos, dir, 1); pos2[d] += 1; if (czyCieplo(pos2.data()) == 1) { dir[d] = 1; any = true; } } if (!any) dir = std::vector<int>(D,1); dim.clear(); } else { dim.erase(dd); dir[dd] = 1; } int l = 0; int r = R-maxR; while (l<r) { int s = (l+r)/2; auto pos2 = add(pos, dir, s); auto pos3 = add(pos2, dir); czyCieplo(pos2.data()); if (czyCieplo(pos3.data()) == 1) l = s+1; else r = s; } pos = add(pos, dir, l); for (int d=0;d<D;++d) maxR = std::max(maxR, pos[d]); } znalazlem(pos.data()); } |
English