NoiminのNoise

競技プログラミング (多め) とWeb (たまに) ,自然言語処理 (ブログではまだ)。数式の書き方を一気に KaTeX に変えようとして記事を全削除してインポートし直すなどしたので,過去にブックマークされた記事は URL が変わってしまっている可能性があります…….

Codeforces Round #478 (Div. 2) D. Ghosts

codeforces.com

問題概要

二次元座標上に直線{ \displaystyle y=ax+b$があり,ある時刻<img src=連立方程式が成り立つ.

{ \displaystyle x_1 + v_{x1} t = x_2 + v_{x2} t $</p>

<p><img src=連想配列などを用いて{ \displaystyle O(n) $で判定できる.</p>

<p>ただし,時刻<img src=ソースコード

#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;
}

所感

これぐらいの幾何はコンテスト中に解きたかった