Codeforces Round #478 (Div. 2) D. Ghosts
問題概要
二次元座標上に直線連立方程式が成り立つ.
#include <iostream> #include <vector> #include <map> #define rep(n) for(int i=0;i<n;i++) using namespace std; typedef long long ll; typedef pair<ll, ll> Pll; int main() { ll n, a, b; cin >> n >> a >> b; vector<ll> x(n); vector<Pll> v(n); rep(n) cin >> x[i] >> v[i].first >> v[i].second; ll ans = 0LL; map<ll, ll> mp; map<Pll, ll> mpv; rep(n){ mp[a*v[i].first - v[i].second]++; mpv[v[i]]++; } for(auto itr=mp.begin();itr!=mp.end();++itr){ ll m = itr->second; ans += m * (m-1); } for(auto itr=mpv.begin();itr!=mpv.end();++itr){ ll m = itr->second; ans -= m * (m-1); } cout << ans << endl; }
所感
これぐらいの幾何はコンテスト中に解きたかった