Advertisement
dmkozyrev

229.cpp

May 22nd, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3.  
  4. /*
  5.     Прибавлять нет смысла, так как разность баллов не уменьшается
  6.    
  7.     Будем только умножать:
  8.         A1 * x[i] + A2 * y[i] = A1 * (x[i] + A2/A1 y[i])
  9.    
  10.     Поэтому умножение сводится к умножению отдельного столбца:
  11.         A * x[i] + y[i]
  12.    
  13.     Для каждого элемента столбца будем оценивать множитель снизу так, чтобы в сумме результат превосходил все остальные, то есть
  14.    
  15.     Было:
  16.         x[i] + y[i] < x[j] + y[j]
  17.        
  18.     После умножения:
  19.         A * x[i] + y[i] >= A * x[j] + y[j]
  20.         A * (x[i] - x[j]) >= y[j] - y[i]
  21.        
  22.     Оценка снизу получается, когда:
  23.         x[i] > x[j] и y[j] > y[i]
  24.        
  25.     Тогда:
  26.         A >= (y[j] - y[i]) / (x[i] - x[j])
  27. */
  28.  
  29. bool win_x(const std::vector<int> & x, const std::vector<int> & y, int i) {
  30.     long long p = 1, q = 1;
  31.     for (int j = 1; j < (int)x.size(); ++j)
  32.         if (x[i] >= x[j] && y[i] >= y[j])
  33.             continue;
  34.         else if (x[i] <= x[j] && y[i] <= y[j])
  35.             return false;
  36.         else if (x[i] > x[j] && y[j] > y[i]) {
  37.             long long new_p = y[j] - y[i];
  38.             long long new_q = x[i] - x[j];
  39.             if (p*new_q <= q*new_p) {
  40.                 p = new_p;
  41.                 q = new_q;
  42.             }
  43.         }
  44.    
  45.     for (int j = 1; j < (int) x.size(); ++j)
  46.         if ( p * x[j] > q * 100000)
  47.             return false;
  48.    
  49.     for (int j = 1; j < (int) x.size(); ++j)
  50.         if ( p * (x[i] - x[j]) < q * (y[j] - y[i]))
  51.             return false;
  52.    
  53.     return true;
  54. }
  55.  
  56.  
  57. int main() {
  58.     freopen("input.txt", "rt", stdin);
  59.     freopen("output.txt", "wt", stdout);
  60.    
  61.     int n; scanf("%d", &n);
  62.    
  63.     std::vector<int> vx(1+n), vy(1+n);
  64.    
  65.    
  66.     for (int i = 1; i <= n; ++i) {
  67.         double a, b;
  68.         scanf("%lf %lf", &a, &b);
  69.         vx[i] = (int)(a*1000+0.5);
  70.         vy[i] = (int)(b*1000+0.5);
  71.     }
  72.    
  73.     std::vector<int> wins;
  74.     for (int i = 1; i <= n; ++i)
  75.         if ( win_x(vx, vy, i) || win_x(vy, vx, i) )
  76.             wins.push_back(i);
  77.            
  78.     printf("%d\n", (int) wins.size());
  79.    
  80.     for (auto & it : wins)
  81.         printf("%d ", it);
  82.        
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement