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.
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.
In the first line print an integer — the number of triangles with the non-zero area among the painted points.
4 0 0 1 1 2 0 2 2
3
3 0 0 1 1 2 0
1
1 1 1
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; }