#include<bits/stdc++.h>
#define PII pair<int,int>
#define f first
#define s second
#define VI vector<int>
#define LL long long
#define MP make_pair
#define LD long double
#define PB push_back
#define ALL(V) V.begin(),V.end()
#define abs(x) max((x),-(x))
#define PDD pair<LD,LD>
#define VPII vector< PII >
#define siz(V) ((int)V.size())
#define FOR(x, b, e) for(int x=b;x<=(e);x++)
#define FORD(x, b, e) for(int x=b;x>=(e);x--)
#define REP(x, n) for(int x=0;x<(n);x++)
#define mini(a,b) a=min(a,b)
#define maxi(a,b) a=max(a,b)
#ifdef DEB
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define debug(...)
#endif
#include "cielib.h"
using namespace std;
const int MD = 5e2 + 4;
int low[MD], high[MD];
int query1[MD], query2[MD];
int main() {
int d = podajD();
int r = podajR();
podajK();
for (int i = 0; i < d; ++i) high[i] = r;
while (true) {
for (int i = 0; i < d; ++i) {
debug("[%d, %d]%c", low[i], high[i], i == d - 1 ? '\n' : 'x');
}
int wh = -1, mdist = 1;
for (int i = 0; i < d; ++i) {
if (mdist <= high[i] - low[i]) {
mdist = high[i] - low[i];
wh = i;
}
}
if (wh == -1) break;
debug("try %d\n", wh);
for (int i = 0; i < d; ++i)
query1[i] = query2[i] = (low[i] + high[i]) / 2;
if ((high[wh] - low[wh]) % 2) {
if (low[wh] > 0) {
query1[wh] = low[wh] - 1;
query2[wh] = high[wh];
czyCieplo(query1);
if (czyCieplo(query2))
low[wh] = (low[wh] + high[wh]) / 2 + 1;
else
high[wh] = (low[wh] + high[wh]) / 2;
}
else if (high[wh] < r) {
debug("case 2\n");
query1[wh] = high[wh] + 1;
query2[wh] = low[wh];
czyCieplo(query1);
if (czyCieplo(query2))
high[wh] = (low[wh] + high[wh]) / 2;
else
low[wh] = (low[wh] + high[wh]) / 2 + 1;
}
else {
debug("case 3\n");
query1[wh] = 0;
query2[wh] = r;
czyCieplo(query1);
if (czyCieplo(query2))
low[wh] = (low[wh] + high[wh] + 1) / 2;
else
high[wh] = (low[wh] + high[wh] + 1) / 2;
}
}
else {
query1[wh] = low[wh];
query2[wh] = high[wh];
czyCieplo(query1);
if (czyCieplo(query2))
low[wh] = (low[wh] + high[wh]) / 2 + 1;
else
high[wh] = (low[wh] + high[wh]) / 2;
}
}
znalazlem(low);
}
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 | #include<bits/stdc++.h> #define PII pair<int,int> #define f first #define s second #define VI vector<int> #define LL long long #define MP make_pair #define LD long double #define PB push_back #define ALL(V) V.begin(),V.end() #define abs(x) max((x),-(x)) #define PDD pair<LD,LD> #define VPII vector< PII > #define siz(V) ((int)V.size()) #define FOR(x, b, e) for(int x=b;x<=(e);x++) #define FORD(x, b, e) for(int x=b;x>=(e);x--) #define REP(x, n) for(int x=0;x<(n);x++) #define mini(a,b) a=min(a,b) #define maxi(a,b) a=max(a,b) #ifdef DEB #define debug(...) fprintf(stderr, __VA_ARGS__) #else #define debug(...) #endif #include "cielib.h" using namespace std; const int MD = 5e2 + 4; int low[MD], high[MD]; int query1[MD], query2[MD]; int main() { int d = podajD(); int r = podajR(); podajK(); for (int i = 0; i < d; ++i) high[i] = r; while (true) { for (int i = 0; i < d; ++i) { debug("[%d, %d]%c", low[i], high[i], i == d - 1 ? '\n' : 'x'); } int wh = -1, mdist = 1; for (int i = 0; i < d; ++i) { if (mdist <= high[i] - low[i]) { mdist = high[i] - low[i]; wh = i; } } if (wh == -1) break; debug("try %d\n", wh); for (int i = 0; i < d; ++i) query1[i] = query2[i] = (low[i] + high[i]) / 2; if ((high[wh] - low[wh]) % 2) { if (low[wh] > 0) { query1[wh] = low[wh] - 1; query2[wh] = high[wh]; czyCieplo(query1); if (czyCieplo(query2)) low[wh] = (low[wh] + high[wh]) / 2 + 1; else high[wh] = (low[wh] + high[wh]) / 2; } else if (high[wh] < r) { debug("case 2\n"); query1[wh] = high[wh] + 1; query2[wh] = low[wh]; czyCieplo(query1); if (czyCieplo(query2)) high[wh] = (low[wh] + high[wh]) / 2; else low[wh] = (low[wh] + high[wh]) / 2 + 1; } else { debug("case 3\n"); query1[wh] = 0; query2[wh] = r; czyCieplo(query1); if (czyCieplo(query2)) low[wh] = (low[wh] + high[wh] + 1) / 2; else high[wh] = (low[wh] + high[wh] + 1) / 2; } } else { query1[wh] = low[wh]; query2[wh] = high[wh]; czyCieplo(query1); if (czyCieplo(query2)) low[wh] = (low[wh] + high[wh]) / 2 + 1; else high[wh] = (low[wh] + high[wh]) / 2; } } znalazlem(low); } |
English