Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- /*
- Прибавлять нет смысла, так как разность баллов не уменьшается
- Будем только умножать:
- A1 * x[i] + A2 * y[i] = A1 * (x[i] + A2/A1 y[i])
- Поэтому умножение сводится к умножению отдельного столбца:
- A * x[i] + y[i]
- Для каждого элемента столбца будем оценивать множитель снизу так, чтобы в сумме результат превосходил все остальные, то есть
- Было:
- x[i] + y[i] < x[j] + y[j]
- После умножения:
- A * x[i] + y[i] >= A * x[j] + y[j]
- A * (x[i] - x[j]) >= y[j] - y[i]
- Оценка снизу получается, когда:
- x[i] > x[j] и y[j] > y[i]
- Тогда:
- A >= (y[j] - y[i]) / (x[i] - x[j])
- */
- bool win_x(const std::vector<int> & x, const std::vector<int> & y, int i) {
- long long p = 1, q = 1;
- for (int j = 1; j < (int)x.size(); ++j)
- if (x[i] >= x[j] && y[i] >= y[j])
- continue;
- else if (x[i] <= x[j] && y[i] <= y[j])
- return false;
- else if (x[i] > x[j] && y[j] > y[i]) {
- long long new_p = y[j] - y[i];
- long long new_q = x[i] - x[j];
- if (p*new_q <= q*new_p) {
- p = new_p;
- q = new_q;
- }
- }
- for (int j = 1; j < (int) x.size(); ++j)
- if ( p * x[j] > q * 100000)
- return false;
- for (int j = 1; j < (int) x.size(); ++j)
- if ( p * (x[i] - x[j]) < q * (y[j] - y[i]))
- return false;
- return true;
- }
- int main() {
- freopen("input.txt", "rt", stdin);
- freopen("output.txt", "wt", stdout);
- int n; scanf("%d", &n);
- std::vector<int> vx(1+n), vy(1+n);
- for (int i = 1; i <= n; ++i) {
- double a, b;
- scanf("%lf %lf", &a, &b);
- vx[i] = (int)(a*1000+0.5);
- vy[i] = (int)(b*1000+0.5);
- }
- std::vector<int> wins;
- for (int i = 1; i <= n; ++i)
- if ( win_x(vx, vy, i) || win_x(vy, vx, i) )
- wins.push_back(i);
- printf("%d\n", (int) wins.size());
- for (auto & it : wins)
- printf("%d ", it);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement