// tell me a superman story and hope that dc code is cool about this
#include "cielib.h"
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cstring>
#include <cassert>
using namespace std;
#define rep(i,a,n) for (int i=a;i<(n);i++)
#define per(i,a,n) for (int i=(n)-1;i>=(a);i--)
template<typename T> ostream& operator<<(ostream& s, vector<T> t) {rep(i, 0, t.size()) s << (i ? " " : "") << t[i]; return s;}
template<typename T> istream& operator>>(istream& s, vector<T> &t) {rep(i, 0, t.size()) s >> t[i]; return s;}
typedef long long ll;
int main() {
int d = podajD();
int r = podajR();
vector<int> from(d, 0), to(d, r);
int t[d];
int maxRange = r;
do {
int range = maxRange;
maxRange = 0;
rep(i, 0, d) t[i] = (to[i] + from[i]) / 2;
rep(i, 0, d) {
if (from[i] + 1 >= to[i]) continue;
t[i] = to[i];
czyCieplo(t);
t[i] = from[i];
bool b0 = czyCieplo(t);
t[i] = to[i];
bool b1 = czyCieplo(t);
t[i] = (to[i] + from[i]) / 2;
assert(!b0 || !b1);
if (b0) {
to[i] = (from[i] + to[i] - 1) / 2;
} else if (b1) {
from[i] = (from[i] + to[i] + 2) / 2;
} else {
int f0 = from[i], t0 = to[i];
from[i] = t0 - (range + 1) / 2;
to[i] = f0 + (range + 1) / 2;
assert(from[i] <= to[i]);
}
maxRange = max(maxRange, to[i] - from[i]);
}
/*rep(i, 0, d) {
cout << i << ": " << from[i] << "-" << to[i] << endl;
}
cout << endl;*/
} while (maxRange > 1);
rep(i, 0, d) t[i] = (to[i] + from[i]) / 2;
rep(i, 0, d) {
if (from[i] != to[i]) {
assert(from[i] + 1 == to[i]);
if (from[i] > 0) {
t[i] = from[i] - 1;
czyCieplo(t);
t[i] = to[i];
if (czyCieplo(t)) {
from[i] = to[i];
} else {
to[i] = from[i];
}
} else {
assert(to[i] < d);
t[i] = to[i] + 1;
czyCieplo(t);
t[i] = from[i];
if (czyCieplo(t)) {
to[i] = from[i];
} else {
from[i] = to[i];
}
}
}
}
rep(i, 0, d) t[i] = (to[i] + from[i]) / 2;
/*rep(i, 0, d) {
cout << i << ": " << from[i] << "-" << to[i] << endl;
}*/
znalazlem(t);
}
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 | // tell me a superman story and hope that dc code is cool about this #include "cielib.h" #include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <cstring> #include <cassert> using namespace std; #define rep(i,a,n) for (int i=a;i<(n);i++) #define per(i,a,n) for (int i=(n)-1;i>=(a);i--) template<typename T> ostream& operator<<(ostream& s, vector<T> t) {rep(i, 0, t.size()) s << (i ? " " : "") << t[i]; return s;} template<typename T> istream& operator>>(istream& s, vector<T> &t) {rep(i, 0, t.size()) s >> t[i]; return s;} typedef long long ll; int main() { int d = podajD(); int r = podajR(); vector<int> from(d, 0), to(d, r); int t[d]; int maxRange = r; do { int range = maxRange; maxRange = 0; rep(i, 0, d) t[i] = (to[i] + from[i]) / 2; rep(i, 0, d) { if (from[i] + 1 >= to[i]) continue; t[i] = to[i]; czyCieplo(t); t[i] = from[i]; bool b0 = czyCieplo(t); t[i] = to[i]; bool b1 = czyCieplo(t); t[i] = (to[i] + from[i]) / 2; assert(!b0 || !b1); if (b0) { to[i] = (from[i] + to[i] - 1) / 2; } else if (b1) { from[i] = (from[i] + to[i] + 2) / 2; } else { int f0 = from[i], t0 = to[i]; from[i] = t0 - (range + 1) / 2; to[i] = f0 + (range + 1) / 2; assert(from[i] <= to[i]); } maxRange = max(maxRange, to[i] - from[i]); } /*rep(i, 0, d) { cout << i << ": " << from[i] << "-" << to[i] << endl; } cout << endl;*/ } while (maxRange > 1); rep(i, 0, d) t[i] = (to[i] + from[i]) / 2; rep(i, 0, d) { if (from[i] != to[i]) { assert(from[i] + 1 == to[i]); if (from[i] > 0) { t[i] = from[i] - 1; czyCieplo(t); t[i] = to[i]; if (czyCieplo(t)) { from[i] = to[i]; } else { to[i] = from[i]; } } else { assert(to[i] < d); t[i] = to[i] + 1; czyCieplo(t); t[i] = from[i]; if (czyCieplo(t)) { to[i] = from[i]; } else { from[i] = to[i]; } } } } rep(i, 0, d) t[i] = (to[i] + from[i]) / 2; /*rep(i, 0, d) { cout << i << ": " << from[i] << "-" << to[i] << endl; }*/ znalazlem(t); } |
English