CSES - COCI 2007/2008 #2 - Results
Submission details
Task:Pravokutni
Sender:henrikaalto
Submission time:2019-07-31 15:11:40 +0300
Language:C++ (C++17)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED100
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.01 sdetails
#3ACCEPTED0.02 sdetails
#4ACCEPTED0.13 sdetails
#5ACCEPTED0.17 sdetails
#6ACCEPTED0.20 sdetails
#7ACCEPTED0.34 sdetails
#8ACCEPTED0.31 sdetails
#9ACCEPTED0.81 sdetails
#10ACCEPTED0.67 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:29:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
input/code.cpp:31:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&x[i],&y[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~

Code

#pragma GCC optimize("O3")
#pragma GCC target("arch=sandybridge")
#include<bits/stdc++.h>
using namespace std;
struct point {
    int x, y;
    point(int X, int Y) {
        x = X;
        y = Y;
    }
    point() {}
    bool operator==(point b)
    {
        return x == b.x && y == b.y;
    }
    bool operator!=(point b)
    {
        return !(*this == b);
    }
} v[1555], p[1555];
bool operator<(const point &a, const point &b)
{
    return a.x == b.x ? a.y < b.y : a.x < b.x;
}
int x[1555], y[1555];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d%d",&x[i],&y[i]);
    }
    int r = 0;
    for (int it = 0; it < n; ++it) {
        int o = 0;
        for (int j = 0; j < n; ++j) {
            if (it == j) continue;
            point z(x[it] - x[j], y[it] - y[j]);
            int u = abs(__gcd(z.x, z.y));
            z.x /= u;
            z.y /= u;
            p[o++] = z;
        }
        memmove(v, p, (n - 1) * sizeof(point));
        sort(v, v + n - 1);
        for (int i = 0; i < n - 1; ++i) {
            int t = i;
            while (t + 1 < n - 1 && p[t + 1] == p[t]) ++t;
            point z(p[i].y, -p[i].x);
            auto it = equal_range(v,v+n-1, z);
            if (*it.first != z) continue;
            r += (it.second - it.first) * (t - i + 1);
            i = t;
        }
    }
    cout << r << "\n";
}

Test details

Test 1

Verdict: ACCEPTED

input
11
2 1
7 7
0 0
-8 -7
...

correct output
8

user output
8

Test 2

Verdict: ACCEPTED

input
77
25 -19
-13 -11
-2 -24
-19 4
...

correct output
8082

user output
8082

Test 3

Verdict: ACCEPTED

input
219
2 -8
859 -3283
33 -49
2 -45
...

correct output
2533

user output
2533

Test 4

Verdict: ACCEPTED

input
751
-841 1308
-1603 -1143
657 -330
1565 1551
...

correct output
180

user output
180

Test 5

Verdict: ACCEPTED

input
887
-318 -111
-51 -42
-60 30
0 15
...

correct output
656682

user output
656682

Test 6

Verdict: ACCEPTED

input
979
-19978 14584
-19978 13600
22840 -19949
-19712 14218
...

correct output
217863

user output
217863

Test 7

Verdict: ACCEPTED

input
1240
509503063 -256406432
-487207177 245187456
-487207659 245185046
-392411792 -779758123
...

correct output
261035

user output
261035

Test 8

Verdict: ACCEPTED

input
1419
908609234 -961461577
908607806 -961461577
908608142 -961460058
908607491 -961461577
...

correct output
471204

user output
471204

Test 9

Verdict: ACCEPTED

input
1494
17337298 165736671
41562836 397321778
286305326 -29949683
392177969 -41024755
...

correct output
2984

user output
2984

Test 10

Verdict: ACCEPTED

input
1500
99601355 -35091687
142757373 -376358953
-233911476 -88725398
-3360747 -162507391
...

correct output
192311

user output
192311