結果

問題 No.2873 Kendall's Tau
ユーザー tottoripaper
提出日時 2024-09-08 23:01:06
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 134 ms / 4,500 ms
コード長 2,017 bytes
コンパイル時間 2,357 ms
コンパイル使用メモリ 210,236 KB
最終ジャッジ日時 2025-02-24 06:02:58
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

#define fst(t) std::get<0>(t)
#define snd(t) std::get<1>(t)

using ll = std::int64_t;
using P = std::tuple<int, int>;

struct FenwickTree{
    std::vector<int> data;

    FenwickTree(int n) : data(n + 1) {}

    void add(int k, int v){
        k += 1;
        while(k < data.size()){
            data[k] += v;
            k += k & -k;
        }
    }

    int sum(int r){
        r = std::min<int>(r, data.size() - 1);

        int res = 0;
        while(r > 0){
            res += data[r];
            r -= r & -r;
        }

        return res;
    }

    int sum(int l, int r){
        return sum(r) - sum(l);
    }

    int at(int k){
        return sum(k, k + 1);
    }
};

int main(){
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);

    int N;
    std::cin >> N;

    std::vector<P> xy(N);
    for(int i=0;i<N;i++){
        std::cin >> fst(xy[i]) >> snd(xy[i]);
    }

    {
        std::vector<int> y(N);
        for(int i=0;i<N;i++){
            y[i] = snd(xy[i]);
        }

        std::sort(std::begin(y), std::end(y));
        y.erase(std::unique(std::begin(y), std::end(y)), std::end(y));

        for(int i=0;i<N;i++){
            snd(xy[i]) = std::lower_bound(std::begin(y), std::end(y), snd(xy[i])) - std::begin(y);
        }
    }

    std::sort(std::begin(xy), std::end(xy));

    FenwickTree t(N);
    ll p = 0, q = 0, r = 0, s = 0;
    for(int i=0,j=0;i<N;i=j){
        while(j < N && fst(xy[j]) == fst(xy[i])){j += 1;}

        r += 1ll * (j - i) * i;

        for(int k=i;k<j;k++){
            ll np = t.sum(snd(xy[k]) + 1, N);
            ll nn = t.sum(0, snd(xy[k]));

            p += nn;
            q += np;
        }

        for(int k=i;k<j;k++){
            ll np = t.sum(snd(xy[k]) + 1, N);
            ll nn = t.sum(0, snd(xy[k]));
            s += np + nn;            

            t.add(snd(xy[k]), 1);
        }
    }

    double res = (1.0 * p - q) / std::sqrt(1.0 * r * s);
    std::cout << std::setprecision(12) << res << std::endl;
}
0