結果
| 問題 |
No.947 ABC包囲網
|
| コンテスト | |
| ユーザー |
square1001
|
| 提出日時 | 2020-01-29 23:05:20 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 6 ms / 2,000 ms |
| コード長 | 1,865 bytes |
| コンパイル時間 | 1,262 ms |
| コンパイル使用メモリ | 87,824 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-16 03:04:15 |
| 合計ジャッジ時間 | 3,112 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 60 |
ソースコード
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct point2d {
public:
int x, y;
point2d() : x(0), y(0) {};
point2d(int x_, int y_) : x(x_), y(y_) {};
point2d operator-() const {
return point2d(-x, -y);
}
int quadrant() const {
if (y == 0) return x > 0 ? 0 : 4;
if (x == 0) return y > 0 ? 2 : 6;
if (y > 0) return x > 0 ? 1 : 3;
return x > 0 ? 7 : 5;
}
bool operator==(const point2d& p) const {
return x == p.x && y == p.y;
}
bool operator!=(const point2d& p) const {
return x != p.x || y != p.y;
}
bool operator<(const point2d& p) const {
int qa = quadrant(), qb = p.quadrant();
if (qa != qb) return qa < qb;
return 1LL * x * p.y > 1LL * y * p.x;
}
};
int gcd(int x, int y) {
if (y == 0) return x;
return gcd(y, x % y);
}
int main() {
cin.tie(0);
ios_base::sync_with_stdio(false);
int N;
cin >> N;
vector<point2d> P(N);
vector<point2d> pli;
for (int i = 0; i < N; ++i) {
cin >> P[i].x >> P[i].y;
int g = gcd(abs(P[i].x), abs(P[i].y));
P[i].x /= g;
P[i].y /= g;
pli.push_back(P[i]);
pli.push_back(-P[i]);
}
sort(pli.begin(), pli.end());
pli.erase(unique(pli.begin(), pli.end()), pli.end());
int M = pli.size() / 2;
vector<int> seq(2 * M);
for (int i = 0; i < N; ++i) {
int ptr = lower_bound(pli.begin(), pli.end(), P[i]) - pli.begin();
++seq[ptr];
}
int sump = 0, sumq = 0;
for (int i = 0; i < M; ++i) {
sump += seq[i];
}
sumq = sump + seq[M];
long long ans = 0;
for (int i = 0; i < 2 * M; ++i) {
ans += 1LL * sumq * (sumq - 1) * (sumq - 2) - 1LL * sump * (sump - 1) * (sump - 2);
sump += seq[i < M ? i + M : i - M] - seq[i];
sumq += seq[i < M - 1 ? i + M + 1 : i - M + 1] - seq[i];
}
for (int i = 0; i < M; ++i) {
ans -= seq[i] * seq[i + M] * (seq[i] + seq[i + M] - 2) * 3;
}
cout << (1LL * N * (N - 1) * (N - 2) - ans) / 6 << endl;
return 0;
}
square1001