N2 log N time might be too slow.
baseball.cpp
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#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 int_compare(const void *a, const void *b){
return *(int *)a - *(int *)b;
}
int main() {
ofstream fout ("baseball.out");
ifstream fin ("baseball.in");
// Read positions
int N;
fin >> N;
int *positions = new int[N];
loopi(N)
fin >> positions[i];
vector<int> p(positions, positions + N);
// Sort positions
sort(p.begin(), p.end());
// Process the list
int possibilities = 0;
/*
Find triples that match: a < b < c, (b-a) <= (c-b) <= 2(b-a)
(b-a) <= (c-b): b - a <= c - b : 2b <= a + c
a >= 2b - c
b <= (a + c) / 2: b - a <= (c - a) / 2
c >= 2b - a
(c-b) <= 2(b-a): c - b <= 2b - 2a: c + 2a <= 3b
a <= (3b-c)/2
b >= (2a+c)/3: b - a >= (c - a) / 2
c <= 3b - 2a
a b c a b c
|--|--| OR |--|-----|
b - a must be within 1/3 and 1/2 of c - a
*/
loop_start(a, N - 2, 0){
loop_start(c, N, a + 2){
int min_index = lower_bound(p.begin(), p.end(), (2 * p[a] + p[c] + 2)/3) - p.begin(); // round up
if(min_index <= a) continue;
int max_index = upper_bound(p.begin(), p.end(), (p[a] + p[c]) / 2) - p.begin();
if(max_index >= c) continue;
possibilities += max_index - min_index + 1;
}
}
fout << possibilities << endl;
delete[] positions;
return 0;
}
No comments:
Post a Comment