#include "cielib.h"
#include <cstdio>
#include <set>
#include <vector>
using namespace std;
#define FOR(i, n) for(int i = 0; i < n; i++)
const int MAX_D = 510;
struct Interval {
int beg, end;
Interval(){}
Interval(int beg, int end): beg(beg), end(end) {}
int f() {
return end - beg;
}
int mean() {
return (beg + end) / 2;
}
void update_beg() {
beg = mean() + 1;
}
void update_end() {
end = mean() + (f() & 1);
}
};
int r, d, k;
Interval I[MAX_D];
int *inp[2];
int procceed() {
int max_d = -1, max_f = 1;
for(int i = 0; i < d; i ++) {
int f = I[i].f();
if(f > max_f) {
max_f = f;
max_d = i;
}
inp[0][i] = I[i].mean();
inp[1][i] = I[i].mean();
}
if(max_d == -1) return max_d;
inp[0][max_d] = I[max_d].beg;
inp[1][max_d] = I[max_d].end;
return max_d;
}
int main() {
r = podajR();
d = podajD();
k = podajK();
inp[0] = new int[d];
inp[1] = new int[d];
for(int i = 0; i < d; i++)
I[i] = Interval(0, r);
int d_idx, status;
while((d_idx = procceed()) != -1) {
czyCieplo(inp[0]);
status = czyCieplo(inp[1]);
switch(status) {
case 0:
I[d_idx].update_end();
break;
case 1:
I[d_idx].update_beg();
}
}
// case when every length == 1
for(int i = 0; i < d; i++) {
inp[0][i] = I[i].beg;
inp[1][i] = I[i].beg;
}
for(int i = 0; i < d; i++) {
switch(I[i].beg) {
case 0:
inp[0][i] = I[i].end + 1;
czyCieplo(inp[0]);
status = czyCieplo(inp[1]);
if(status == 0)
FOR(t, 2) inp[t][i] = I[i].end;
if(status == 1)
FOR(t, 2) inp[t][i] = I[i].beg;
break;
default:
inp[0][i] = I[i].beg - 1;
inp[1][i] = I[i].end;
czyCieplo(inp[0]);
status = czyCieplo(inp[1]);
if(status == 0)
FOR(t, 2) inp[t][i] = I[i].beg;
if(status == 1)
FOR(t, 2) inp[t][i] = I[i].end;
}
}
znalazlem(inp[0]);
delete inp[0];
delete inp[1];
}
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 111 112 113 114 115 116 117 | #include "cielib.h" #include <cstdio> #include <set> #include <vector> using namespace std; #define FOR(i, n) for(int i = 0; i < n; i++) const int MAX_D = 510; struct Interval { int beg, end; Interval(){} Interval(int beg, int end): beg(beg), end(end) {} int f() { return end - beg; } int mean() { return (beg + end) / 2; } void update_beg() { beg = mean() + 1; } void update_end() { end = mean() + (f() & 1); } }; int r, d, k; Interval I[MAX_D]; int *inp[2]; int procceed() { int max_d = -1, max_f = 1; for(int i = 0; i < d; i ++) { int f = I[i].f(); if(f > max_f) { max_f = f; max_d = i; } inp[0][i] = I[i].mean(); inp[1][i] = I[i].mean(); } if(max_d == -1) return max_d; inp[0][max_d] = I[max_d].beg; inp[1][max_d] = I[max_d].end; return max_d; } int main() { r = podajR(); d = podajD(); k = podajK(); inp[0] = new int[d]; inp[1] = new int[d]; for(int i = 0; i < d; i++) I[i] = Interval(0, r); int d_idx, status; while((d_idx = procceed()) != -1) { czyCieplo(inp[0]); status = czyCieplo(inp[1]); switch(status) { case 0: I[d_idx].update_end(); break; case 1: I[d_idx].update_beg(); } } // case when every length == 1 for(int i = 0; i < d; i++) { inp[0][i] = I[i].beg; inp[1][i] = I[i].beg; } for(int i = 0; i < d; i++) { switch(I[i].beg) { case 0: inp[0][i] = I[i].end + 1; czyCieplo(inp[0]); status = czyCieplo(inp[1]); if(status == 0) FOR(t, 2) inp[t][i] = I[i].end; if(status == 1) FOR(t, 2) inp[t][i] = I[i].beg; break; default: inp[0][i] = I[i].beg - 1; inp[1][i] = I[i].end; czyCieplo(inp[0]); status = czyCieplo(inp[1]); if(status == 0) FOR(t, 2) inp[t][i] = I[i].beg; if(status == 1) FOR(t, 2) inp[t][i] = I[i].end; } } znalazlem(inp[0]); delete inp[0]; delete inp[1]; } |
English