a53

InfasuratoareConvexa

a53
Mar 1st, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #define INF 1002
  5.  
  6. using namespace std;
  7.  
  8. ifstream fin ("infasuratoareconvexa.in");
  9. ofstream fout("infasuratoareconvexa.out");
  10.  
  11. int det(int X1, int Y1, int X2, int Y2, int X3, int Y3) {
  12. return (X2-X1)*(Y3-Y1) - (X3-X1)*(Y2-Y1);
  13. }
  14.  
  15.  
  16. int cmp(const pair<int, int> &a, const pair<int, int> &b) {
  17. int d = det(0, 0, a.first, a.second, b.first, b.second);
  18. if (d != 0)
  19. return d > 0;
  20. else
  21. return a.first*a.first + a.second*a.second > b.first*b.first + b.second*b.second;
  22. }
  23.  
  24. pair<int, int> v[103], s[103], aux;
  25.  
  26. int n, i, j, k, pminim;
  27.  
  28. int main() {
  29.  
  30. fin>>n;
  31. pminim = 0;
  32. v[0].first = v[0].second = INF;
  33. for (i=1;i<=n;i++) {
  34. fin>>v[i].first>>v[i].second;
  35. if (v[i].second < v[pminim].second || ( (v[i].second == v[pminim].second)&&(v[i].first < v[pminim].first) ))
  36. pminim = i;
  37. }
  38.  
  39. v[0] = v[pminim];
  40. v[pminim] = v[1];
  41. v[1] = v[0];
  42.  
  43. for (i=1;i<=n;i++) {
  44. v[i].first -= v[0].first;
  45. v[i].second -= v[0].second;
  46. }
  47.  
  48. sort(v+2, v+n+1, cmp);
  49.  
  50. for (j=3;j<=n;j++)
  51. if (det(v[1].first, v[1].second, v[2].first, v[2].second, v[j].first, v[j].second)) {
  52. break;
  53. }
  54. i=2;
  55. j--;
  56. while (i<j) {
  57. aux = v[i];
  58. v[i] = v[j];
  59. v[j] = aux;
  60. i++;
  61. j--;
  62. }
  63.  
  64. s[1] = v[1];
  65. s[2] = v[2];
  66. k = 2;
  67. for (i=3;i<=n;i++) {
  68. while (k >= 2 && det(s[k-1].first, s[k-1].second, s[k].first, s[k].second, v[i].first, v[i].second) < 0 ) {
  69. k--;
  70. }
  71. s[++k] = v[i];
  72.  
  73. }
  74. fout<<k<<"\n";
  75. for (i=1;i<=k;i++)
  76. fout<<s[i].first + v[0].first<<" "<<s[i].second + v[0].second<<"\n";
  77.  
  78. return 0;
  79. }
Add Comment
Please, Sign In to add comment