Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <map>
  7.  
  8.  
  9. using namespace std;
  10.  
  11.  
  12.  
  13. struct point{
  14.     int x, y;
  15.     point(){}
  16.     point(int _x, int _y) {
  17.         x = _x;
  18.         y = _y;
  19.     }
  20. };
  21.  
  22.  
  23. inline bool operator < (const point a, const point b) {
  24.     return a.x < b.x || (a.x == b.x && a.y < b.y);
  25. }
  26.  
  27.  
  28. inline bool operator ==(const point a, const point b) {
  29.     return a.x == b.x && a.y == b.y;
  30. }
  31.  
  32.  
  33. int n;
  34. point p[102];
  35. int dup[102][102], ddown[102][102];
  36. int dup1[102], ddown1[102];
  37. bool d[102][102][102];
  38. pair<int, pair<int, int> > cc[102][102][102];
  39. map<point, int> m;
  40.  
  41.  
  42. int main() {
  43.   //freopen("division.in", "r", stdin);freopen("division.out", "w", stdout);
  44.     cin >> n;
  45.     for (int i = 0; i < n; i++) {
  46.         cin >> p[i].x >> p[i].y;
  47.         m[p[i]] = i + 1;
  48.     }
  49.     sort(p, p + n);
  50.     for (int i = 0; i < n; i++) {
  51.         for (int j = i + 1; j < n; j++) {
  52.             int a = p[i].y - p[j].y;
  53.             int b = p[j].x - p[i].x;
  54.             int c = -(a * p[i].x + b * p[i].y);
  55.             for (int k = 0; k < n; k++) {
  56.                 if (p[k].x >= p[i].x && p[k].x < p[j].x) {
  57.                     if (a * p[k].x + b * p[k].y + c > 0) {
  58.                         dup[i][j]++;
  59.                     }
  60.                 }
  61.             }
  62.             for (int k = 0; k < n; k++) {
  63.                 if (p[k].x >= p[i].x && p[k].x < p[j].x) {
  64.                     if (a * p[k].x + b * p[k].y + c < 0) {
  65.                         ddown[i][j]++;
  66.                     }
  67.                 }
  68.             }
  69.             for (int k = 0; k < n; k++) {
  70.                 if (p[k].x > p[i].x && p[k].x < p[j].x) {
  71.                     if (a * p[k].x + b * p[k].y + c == 0) {
  72.                         ddown[i][j] = -200;
  73.                         dup[i][j] = -200;
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.         int a = 0;
  79.         int b = 1;
  80.         int c = -b * p[i].y;
  81.         for (int k = 0; k < n; k++) {
  82.             if (p[k].x < p[i].x) {
  83.                 if (a * p[k].x + b * p[k].y + c > 0) {
  84.                     dup[i][i]++;
  85.                 }
  86.             }
  87.         }
  88.         for (int k = 0; k < n; k++) {
  89.             if (p[k].x < p[i].x) {
  90.                 if (a * p[k].x + b * p[k].y + c < 0) {
  91.                     ddown[i][i]++;
  92.                 }
  93.             }
  94.         }
  95.         for (int k = 0; k < n; k++) {
  96.             if (p[k].x >= p[i].x) {
  97.                 if (a * p[k].x + b * p[k].y + c > 0) {
  98.                     dup1[i]++;
  99.                 }
  100.             }
  101.         }
  102.         for (int k = 0; k < n; k++) {
  103.             if (p[k].x >= p[i].x) {
  104.                 if (a * p[k].x + b * p[k].y + c < 0) {
  105.                     ddown1[i]++;
  106.                 }
  107.             }
  108.         }
  109.     }
  110.     for (int i = 0; i < n; i++) {
  111.         for (int j = 0; j <= n - 1; j++) {
  112.             for (int k = 0; k <= n - 1 - j; k++) {
  113.                 for (int g = i; g >= 0; g--) {
  114.                     if (dup[g][i] >= 0 && j >= dup[g][i] && k >= ddown[g][i] && ((g != i && p[i].x > p[g].x) || (g == i))) {
  115.                         if (d[i][j][k] < d[g][j - dup[g][i]][k - ddown[g][i]]) {
  116.                             d[i][j][k] = d[g][j - dup[g][i]][k - ddown[g][i]];
  117.                             cc[i][j][k] = make_pair(g, make_pair(j - dup[g][i], k - ddown[g][i]));
  118.                         }
  119.                     }
  120.                 }
  121.                 if (j == dup[i][i] && k == ddown[i][i]) {
  122.                     d[i][j][k] = 1;
  123.                     cc[i][j][k] = make_pair(-1, make_pair(-1, -1));
  124.                 }
  125.             }
  126.         }
  127.     }
  128.     int ans = 1000000000;
  129.     int a = 0, b = 0, c = 0;
  130.     vector<pair<point, int> > v;
  131.     for (int i = 0; i < n; i++) {
  132.         for (int j = 0; j <= n - 1; j++) {
  133.             for (int k = 0; k <= n - 1 - j; k++) {
  134.                 if (d[i][j][k]) {
  135.                     int j1 = j + dup1[i];
  136.                     int k1 = k + ddown1[i];
  137.                     if (ans > max(j1, max(k1, n - j1 - k1)) - min(j1, min(k1, n - j1 - k1))) {
  138.                         ans = max(j1, max(k1, n - j1 - k1)) - min(j1, min(k1, n - j1 - k1));
  139.                         //cout << ans << endl;
  140.                       //cout << j << endl;
  141.                         a = i;
  142.                         b = j;
  143.                         c = k;
  144.                       //  cout << "aa";
  145.                     }
  146.                 }
  147.             }
  148.         }
  149.     }
  150.    // cout << ans << endl;
  151.     while (a > -1) {
  152.         v.push_back(make_pair(p[a], m[p[a]]));
  153.         pair<int, pair<int, int> > p = cc[a][b][c];
  154.         a = p.first;
  155.         b = p.second.first;
  156.         c = p.second.second;
  157.     }
  158.     sort(v.begin(), v.end());
  159.     int k = (int)v.size();
  160.     for (int i = 0; i < n; i++) {
  161.         if (p[i].y == v[0].first.y && p[i].x <= v[0].first.x) {
  162.             v.push_back(make_pair(p[i], m[p[i]]));
  163.         }
  164.         if (p[i].y == v[k - 1].first.y && p[i].x >= v[k - 1].first.x) {
  165.             v.push_back(make_pair(p[i], m[p[i]]));
  166.         }
  167.         if (i > 0) {
  168.             int a = p[i - 1].y - p[i].y;
  169.             int b = p[i].x - p[i - 1].x;
  170.             int c = -(a * p[i].x + b * p[i].y);
  171.             for (int j = 0; j < n; j++) {
  172.                 if (a * p[j].x + b * p[j].y + c == 0 && p[j].x > p[i - 1].x && p[j].x < p[i].x) {
  173.                     v.push_back(make_pair(p[j], m[p[j]]));
  174.                 }
  175.             }
  176.         }
  177.     }
  178.     sort(v.begin(), v.end());
  179.     v.resize(distance(v.begin(), unique(v.begin(), v.end())));
  180.     cout << (int)v.size() << endl;
  181.     for (int i = 0; i < (int)v.size(); i++) {
  182.         cout << v[i].second << ' ';
  183.     }
  184.     cout << endl;
  185.     return 0;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement