This is more optimized than my previous correction though still in O(1) time.
combo2.cpp
#include <iostream>
#include <fstream>
#define loopi(x) loop_start(i,x,0)
#define loopj(x) loop_start(j,x,0)
#define loop_start(i, x,s) for(int i = (s); i < (x); ++i)
#define loop_rev(a,x,stop) for(int a = (x); a >= (stop); --a)
using namespace std;
int N;
// based on http://math.stackexchange.com/questions/494971/how-to-determine-the-number-of-degrees-overlap-between-two-circular-slices
int abswrap(int diff){
// diff = wrap(diff)
// diff if -N/2 <= diff <= N/2
// diff + N if diff < -N/2
if(diff < -N/2)
diff += N;
// diff - N if diff > N/2
else if(diff > N/2)
diff -= N;
// return abs(wrap(diff))
return abs(diff);
}
int overlap(int a, int b){
// 2.5 + 2.5 - abswrap(a - b)
// but 0 if negative
return max(0, 5 - abswrap(a - b));
}
#define NUMCOMBO 3
int main() {
ofstream fout ("combo.out");
ifstream fin ("combo.in");
// get input
int combo1[NUMCOMBO];
int combo2[NUMCOMBO];
fin >> N;
loopi(NUMCOMBO)
fin >> combo1[i];
loopi(NUMCOMBO)
fin >> combo2[i];
// calculate:
// Special case: there is always N overlap if N <= 5
if(N <= 5) // 2 * N ** 3 - N ** 3 = N ** 3
// write output
fout << (N * N * N);
else{
int overlap_a = overlap(combo1[0], combo2[0]);
int overlap_b = overlap_a ? overlap(combo1[1], combo2[1]) : 0;
int overlap_c = overlap_b ? overlap(combo1[2], combo2[2]) : 0;
// 2 * 5 ** 3, but subtract the overlap
// write output
fout << (250 - overlap_a * overlap_b * overlap_c);
}
return 0;
}
No comments:
Post a Comment