Codeforces 552D Vanya and Triangles

来源:互联网 发布:乐乎的图片怎么保存 编辑:程序博客网 时间:2024/05/16 14:18

Vanya got bored and he painted n distinct points on the plane. After that he connected all the points pairwise and saw that as a result many triangles were formed with vertices in the painted points. He asks you to count the number of the formed triangles with the non-zero area.

Input

The first line contains integer n (1 ≤ n ≤ 2000) — the number of the points painted on the plane.

Next n lines contain two integers each xi, yi ( - 100 ≤ xi, yi ≤ 100) — the coordinates of the i-th point. It is guaranteed that no two given points coincide.

Output

In the first line print an integer — the number of triangles with the non-zero area among the painted points.

Sample test(s)
Input
40 01 12 02 2
Output
3
Input
30 01 12 0
Output
1
Input
11 1
Output
0
解题思路:一开始还在想怎么去优化统计的方法,结果越做越乱,到最后直接来了一发暴力统计,1300+ms,我现在很想知道CF那个49ms是怎么整的,代码我实在是没看懂。
#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <string>#include <vector>#include <deque>#include <queue>#include <stack>#include <map>#include <set>#include <utility>#include <algorithm>#include <functional>using namespace std;typedef long long ll;const int maxn = 210;vector<int> G[maxn];int main() {    int n, x, y;    ll ans = 0;    scanf("%d", &n);    for(int i = 0; i < n; ++i) {        scanf("%d %d", &x, &y);        G[x+100].push_back(y+100);    }    for(int i = 0; i <= 200; ++i) {        int size = G[i].size();        if(size == 0) continue;        if(size > 1) {            ans += 1LL*size*(size-1)/2*(n-size);        }        for(int j = i + 1; j <= 200; ++j) {            if(G[j].size() == 0) continue;            for(int k = j + 1; k <= 200; ++k) {                if(G[k].size() == 0) continue;                for(int s1 = 0; s1 < (int)G[i].size(); ++s1) {                    for(int s2 = 0; s2 < (int)G[j].size(); ++s2) {                        for(int s3 = 0; s3 < (int)G[k].size(); ++s3) {                            if((G[k][s3]-G[j][s2])*(j-i)==(G[j][s2]-G[i][s1])*(k-j)) continue;                            ans++;                        }                    }                }            }        }    }    cout << ans << endl;    return 0;}


0 0
原创粉丝点击