Advertisement
ice_tea

Untitled

Jul 31st, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.32 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define eps 1e-7
  4. #define inf 1e9
  5. #define linf 1e18
  6. #define pb push_back
  7. #define mod 1e9 + 7
  8. #define mp make_pair
  9. #define ld long double
  10. #define pi 3.141592653589793238462643
  11. using namespace std;
  12.  
  13. ll null = 0;
  14.  
  15. struct segment;
  16. struct line;
  17. struct point;
  18. struct vec;
  19. struct ray;
  20.  
  21.  
  22. struct point{
  23.     ld x, y;
  24.     point(){}
  25.     point(ld x1, ld y1){
  26.         x = x1;
  27.         y = y1;
  28.     }
  29.     ld dist_to_point(point p){
  30.         return sqrt((p.x - x) * (p.x - x) + (p.y - y) * (p.y - y));
  31.     }
  32.     bool operator < (point p){
  33.         return (x < p.x) || ((x == p.x) && (y < p.y));
  34.     }
  35.     ld polar_angle(){
  36.         ld ans = atan2(y, x);
  37.         //if (ans < 0) ans += 2 * pi;
  38.         //if (abs(ans - 2 * pi) < eps) return 0;
  39.         return ans;
  40.     }
  41. };
  42.  
  43. struct vec{
  44.     ld x, y;
  45.     vec (ld x1, ld y1){
  46.         x = x1;
  47.         y = y1;
  48.     }
  49.     vec (point a, point b){
  50.         x = b.x - a.x;
  51.         y = b.y - a.y;
  52.     }
  53.     vec normal(){
  54.         vec ans;
  55.         ans.x = y;
  56.         ans.y = -x;
  57.         return ans;
  58.     }
  59.     vec opposite(){
  60.         vec ans;
  61.         ans.x = -x;
  62.         ans.y = -y;
  63.         return ans;
  64.     }
  65.     vec sum(vec b){
  66.         vec ans;
  67.         ans.x = x + b.x;
  68.         ans.y = y + b.y;
  69.         return ans;
  70.     }
  71.     ld cross_product(vec v){
  72.         return x * v.y - v.x * y;
  73.     }
  74.     ld dot_product(vec v){
  75.         return x * v.x + y * v.y;
  76.     }
  77.     vec resize(ld size){
  78.         vec ans;
  79.         ans.x = (x * size) / len();
  80.         ans.y = (y * size) / len();
  81.         return ans;
  82.     }
  83.     vec(){}
  84.     ld len(){
  85.         return sqrt(x * x + y * y);
  86.     }
  87. };
  88.  
  89.  
  90. struct line{
  91.     ld a, b, c;
  92.     line (point a1, point b1){
  93.         a = a1.y - b1.y;
  94.         b = b1.x - a1.x;
  95.         c = -a1.x * a - a1.y * b;
  96.     }
  97.     line (ld a1, ld b1, ld c1){
  98.         a = a1;
  99.         b = b1;
  100.         c = c1;
  101.     }
  102.     line(){}
  103.     vec normal_vec(){
  104.         vec ans;
  105.         ans.x = a;
  106.         ans.y = b;
  107.         return ans;
  108.     }
  109.     line normal_line(point p){
  110.         line ans;
  111.         ans.a = -b;
  112.         ans.b = a;
  113.         ans.c = -ans.a * p.x - ans.b * p.y;
  114.         return ans;
  115.     }
  116.     ld get_x(ld y1){
  117.         if (a == 0) return 0;
  118.         return (-c - b * y1) / a;
  119.     }
  120.     ld get_y(ld x1){
  121.         if (b == 0) return 0;
  122.         return (-c - a * x1) / b;
  123.     }
  124.     point intersection(line l){
  125.         point ans;
  126.         ans.x = (-c * l.b + l.c * b) / (a * l.b - l.a * b);
  127.         ans.y = (-a * l.c + l.a * c) / (a * l.b - l.a * b);
  128.         return ans;
  129.     }
  130.     ld dist_to_point(point p){
  131.         return abs((a * p.x + b * p.y + c) / (sqrt(a * a + b * b)));
  132.     }
  133.     ll is_inside(point p){
  134.         ld k = a * p.x + b * p.y + c;
  135.         if (k < 0) return -1;
  136.         else if (k == 0) return 0;
  137.         return 1;
  138.     }
  139. };
  140.  
  141. struct segment{
  142.     point a, b;
  143.     segment(){}
  144.     segment(point a1, point b1){
  145.         a = a1;
  146.         b = b1;
  147.     }
  148.     ld len(){
  149.         return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
  150.     }
  151.     bool is_inside(point p){
  152.         line l(a, b);
  153.         if (l.is_inside(p) != 0) return false;
  154.         vec v(p, a), v1(p, b);
  155.         if (v.dot_product(v1) > 0) return false;
  156.         return true;
  157.     }
  158.     long double dist_to_point(point p){
  159.         vec v(a, p), v1(a, b), v2(b, p), v3(b, a);
  160.         if (v.dot_product(v1) < 0) return p.dist_to_point(a);
  161.         if (v2.dot_product(v3) < 0) return p.dist_to_point(b);
  162.         line l(a, b);
  163.         return l.dist_to_point(p);
  164.     }
  165.     point get_center(){
  166.         point ans;
  167.         ans.x = (a.x + b.x) / 2;
  168.         ans.y = (a.y + b.y) / 2;
  169.         return ans;
  170.     }
  171. };
  172.  
  173. struct ray{
  174.     point a, b;
  175.     ray(point p, point p1){
  176.         a = p;
  177.         b = p1;
  178.     }
  179.     ray(){}
  180.     ld dist_to_point(point p){
  181.         vec v(a, p), v1(a, b);
  182.         if (v.dot_product(v1) < 0) return a.dist_to_point(p);
  183.         line l(a, b);
  184.         return l.dist_to_point(p);
  185.     }
  186.     bool is_inside(point p){
  187.         line l(a, b);
  188.         if (l.is_inside(p) != 0) return false;
  189.         vec v(a, p), v1(a, b);
  190.         if (v.dot_product(v1) < 0) return false;
  191.         return true;
  192.     }
  193. };
  194.  
  195. struct angle{
  196.     point a, b, c;
  197.     angle(){};
  198.     angle (point a1, point b1, point c1){
  199.         a = a1;
  200.         b = b1;
  201.         c = c1;
  202.     }
  203.     ld get_angle(){
  204.         vec v(b, a), v1(b, c);
  205.         return acos(v.dot_product(v1) / (v.len() * v1.len()));
  206.     }
  207.     ld get_grad_angle(){
  208.         vec v(b, a), v1(b, c);
  209.         return 180 * acos(v.dot_product(v1) / (v.len() * v1.len())) / pi;
  210.     }
  211. };
  212.  
  213. struct polygon{
  214.     ll n;
  215.     vector <point> points;
  216.     ld get_area(){
  217.         point a(0, 0);
  218.         vec v(a, points[0]);
  219.         ld ans = 0;
  220.         for (ll i = 1; i < n; ++i){
  221.             vec v1(a, points[i]);
  222.             ans = ans + v.cross_product(v1);
  223.             v = v1;
  224.         }
  225.         vec v2(a, points[0]);
  226.         vec v1(a, points[n - 1]);
  227.         return abs(ans + v1.cross_product(v2)) / 2;
  228.     }
  229. };
  230.  
  231. struct triangle{
  232.     point a, b, c;
  233.     triangle(){}
  234.     triangle(point a1, point b1, point c1){
  235.         a = a1;
  236.         b = b1;
  237.         c = c1;
  238.     }
  239.     ld get_area(){
  240.         point d(0, 0);
  241.         vec v(a, d), v1(b, d), v2(c, d);
  242.         return (v.cross_product(v1) + v1.cross_product(v2) + v2.cross_product(v)) / 2;
  243.     }
  244.     point get_center(){
  245.         segment s(a, b), s1(a, c);
  246.         point p = s.get_center(), p1 = s1.get_center();
  247.         line l(a, b), l1(a, c), l2(b, c);
  248.         l = l.normal_line(p);
  249.         l1 = l1.normal_line(p1);
  250.         return l.intersection(l1);
  251.     }
  252.     ld get_R(){
  253.         triangle t(a, b, c);
  254.         point p = t.get_center();
  255.         return p.dist_to_point(a);
  256.     }
  257. };
  258.  
  259. ll power(ll a, ll b){
  260.     if (b == 0) return 1;
  261.     else if (b == 1) return a;
  262.     else {
  263.         ll k = power(a, b / 2);
  264.         return k * k * power(a, b % 2);
  265.     }
  266. }
  267.  
  268. ll power_mod(ll a, ll b, ll MOD){
  269.     if (b == 0) return 1;
  270.     else if (b == 1) return a % MOD;
  271.     else{
  272.         ll k = power_mod(a, b / 2, MOD);
  273.         return ((k * k) % MOD * power_mod(a, b % 2, MOD)) % MOD;
  274.     }
  275. }
  276.  
  277. ll sum_mod(ll a, ll b, ll MOD){
  278.     return (a + b) % MOD;
  279. }
  280.  
  281. ll mul_mod(ll a, ll b, ll MOD){
  282.     return (a * b) % MOD;
  283. }
  284.  
  285. ll ord(char a){
  286.     return a;
  287. }
  288.  
  289. char chr(ll a){
  290.     return a;
  291. }
  292.  
  293. ll strtoint(string s){
  294.     ll ans = 0;
  295.     for (ll i = 0; i < s.size(); ++i){
  296.         ans *= 10;
  297.         ans += ord(s[i]) - 48;
  298.     }
  299.     return ans;
  300. }
  301.  
  302. string rev_string(string s){
  303.     string ans = "";
  304.     for (ll i = s.size(); i >= 0; --i){
  305.         ans += s[i];
  306.     }
  307.     return ans;
  308. }
  309.  
  310. string inttostr(ll a){
  311.     string ans = "", ans1 = "";
  312.     while (a > 0){
  313.         ans += chr(a + 48);
  314.         a /= 10;
  315.     }
  316.     for (ll i = ans.size() - 1; i >= 0; --i){
  317.         ans1 += ans[i];
  318.     }
  319.     return ans1;
  320. }
  321.  
  322. ll gcd(ll a, ll b){
  323.     if (a == 0) return b;
  324.     return gcd(b % a, a);
  325. }
  326.  
  327. ll nok(ll a, ll b){
  328.     return a * b / gcd(a, b);
  329. }
  330.  
  331.  
  332.  
  333. /*
  334. _________________________________________________________________________________________________________________________________________________
  335. start programm
  336. _________________________________________________________________________________________________________________________________________________
  337. */
  338.  
  339. point ar[4000];
  340. vector <ld> arr;
  341.  
  342.  
  343. int main(){
  344.     ios_base::sync_with_stdio(0);
  345.     cin.tie(0);
  346.     cout.tie(0);
  347.     srand(time(0));
  348.     ll n;
  349.     cin>>n;
  350.     /*ll ans2 = 0;
  351.     for (ll i = 0; i < n; ++i){
  352.         for (ll j = i + 1; j < n; ++j){
  353.             ans2 += n - j - 1;
  354.         }
  355.     }*/
  356.     //cout<<ans2 - 177162<<endl;
  357.     for (ll i = 0; i < n; ++i){
  358.         cin>>ar[i].x>>ar[i].y;
  359.     }
  360.     ll ans = 0/*, ans1 = 0*/;
  361.     for (ll i = 0; i < n; ++i){
  362.         for (ll j = i + 1; j < n; ++j){
  363.             //if (i == j) continue;
  364.             point p;
  365.             p.x = ar[j].x - ar[i].x;
  366.             p.y = ar[j].y - ar[i].y;
  367.             arr.pb(p.polar_angle());
  368.         }
  369.         sort(arr.begin(), arr.end());
  370.         //cout<<arr[0]<<" "<<arr[1]<<endl;
  371.         ll l = 0;
  372.         ll r = 0;
  373.         for (l = 0; l < arr.size(); ++l){
  374.             while ((r < arr.size()) && (abs(arr[r] - arr[l]) < eps)) ++r;
  375.             ans += arr.size() - r;
  376.             //ans1 += r - l - 1;
  377.         }
  378.         arr.clear();
  379.     }
  380.     cout<<ans;
  381.     //if ((n == 2000) && (ar[0].x == 73)) cout<<" "<<ans1;
  382. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement