| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1370397 | dienhaidang | Rotating Lines (APIO25_rotate) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <numeric>
#include <map>
using namespace std;
int main() {
// Tối ưu hóa I/O để chống Time Limit Exceeded (TLE)
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
// Đọc số lượng đường thẳng
if (!(cin >> n)) return 0;
long long ans = 0;
map<pair<long long, long long>, int> cnt;
for (int i = 0; i < n; ++i) {
long long x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
// Tính vector chỉ phương (a, b) từ 2 điểm
long long a = x2 - x1;
long long b = y2 - y1;
// Bỏ qua trường hợp lỗi dữ liệu (2 điểm trùng nhau)
if (a == 0 && b == 0) continue;
// Rút gọn vector bằng ước chung lớn nhất (GCD)
long long g = std::gcd(a, b);
long long norm_a = a / g;
long long norm_b = b / g;
// Chuẩn hóa dấu để các vector đối nhau cùng quy về một key duy nhất
// (Ví dụ: vector hướng (-1, -1) và (1, 1) biểu diễn cùng một độ dốc)
if (norm_a < 0 || (norm_a == 0 && norm_b < 0)) {
norm_a = -norm_a;
norm_b = -norm_b;
}
// Kỹ thuật gộp logic: cộng số lượng đường thẳng cùng hướng đã duyệt trước đó
// vào tổng đáp án, sau đó mới tăng bộ đếm của hướng này lên 1.
ans += cnt[{norm_a, norm_b}]++;
}
// In ra tổng số cặp thỏa mãn
cout << ans << "\n";
return 0;
}