結果

問題 No.2873 Kendall's Tau
ユーザー tottoripapertottoripaper
提出日時 2024-09-08 23:01:06
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 136 ms / 4,500 ms
コード長 2,017 bytes
コンパイル時間 2,630 ms
コンパイル使用メモリ 216,660 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-09-08 23:01:13
合計ジャッジ時間 6,810 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,944 KB
testcase_02 AC 3 ms
6,944 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 2 ms
6,940 KB
testcase_07 AC 133 ms
6,944 KB
testcase_08 AC 131 ms
6,940 KB
testcase_09 AC 133 ms
6,944 KB
testcase_10 AC 129 ms
6,944 KB
testcase_11 AC 136 ms
6,940 KB
testcase_12 AC 129 ms
6,944 KB
testcase_13 AC 44 ms
6,944 KB
testcase_14 AC 103 ms
6,940 KB
testcase_15 AC 23 ms
6,940 KB
testcase_16 AC 24 ms
6,940 KB
testcase_17 AC 98 ms
6,940 KB
testcase_18 AC 72 ms
6,940 KB
testcase_19 AC 94 ms
6,940 KB
testcase_20 AC 25 ms
6,944 KB
testcase_21 AC 83 ms
6,944 KB
testcase_22 AC 36 ms
6,944 KB
testcase_23 AC 82 ms
6,940 KB
testcase_24 AC 12 ms
6,940 KB
testcase_25 AC 23 ms
6,944 KB
testcase_26 AC 102 ms
6,940 KB
testcase_27 AC 59 ms
6,944 KB
testcase_28 AC 108 ms
6,940 KB
testcase_29 AC 119 ms
6,944 KB
testcase_30 AC 19 ms
6,940 KB
testcase_31 AC 33 ms
6,944 KB
testcase_32 AC 79 ms
6,944 KB
権限があれば一括ダウンロードができます

ソースコード

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