結果
問題 | No.2873 Kendall's Tau |
ユーザー | n0ma_ru |
提出日時 | 2024-09-06 23:08:28 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 280 ms / 4,500 ms |
コード長 | 3,026 bytes |
コンパイル時間 | 2,598 ms |
コンパイル使用メモリ | 219,848 KB |
実行使用メモリ | 9,984 KB |
最終ジャッジ日時 | 2024-09-06 23:08:42 |
合計ジャッジ時間 | 8,019 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 1 ms
6,940 KB |
testcase_05 | AC | 2 ms
6,944 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 262 ms
9,472 KB |
testcase_08 | AC | 269 ms
9,984 KB |
testcase_09 | AC | 257 ms
9,728 KB |
testcase_10 | AC | 280 ms
9,856 KB |
testcase_11 | AC | 268 ms
9,600 KB |
testcase_12 | AC | 259 ms
9,728 KB |
testcase_13 | AC | 89 ms
6,940 KB |
testcase_14 | AC | 211 ms
8,704 KB |
testcase_15 | AC | 42 ms
6,940 KB |
testcase_16 | AC | 45 ms
6,940 KB |
testcase_17 | AC | 209 ms
7,936 KB |
testcase_18 | AC | 136 ms
6,944 KB |
testcase_19 | AC | 181 ms
7,680 KB |
testcase_20 | AC | 46 ms
6,944 KB |
testcase_21 | AC | 157 ms
7,296 KB |
testcase_22 | AC | 66 ms
6,944 KB |
testcase_23 | AC | 154 ms
7,296 KB |
testcase_24 | AC | 22 ms
6,940 KB |
testcase_25 | AC | 41 ms
6,940 KB |
testcase_26 | AC | 211 ms
7,936 KB |
testcase_27 | AC | 120 ms
6,940 KB |
testcase_28 | AC | 217 ms
8,448 KB |
testcase_29 | AC | 235 ms
9,344 KB |
testcase_30 | AC | 35 ms
6,940 KB |
testcase_31 | AC | 62 ms
6,944 KB |
testcase_32 | AC | 152 ms
7,040 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; #define ALL(v) v.begin(),v.end() #define dbg(x) cerr << #x << ": " << (x) << endl; template<class F, class S> ostream& operator<<(ostream& os, pair<F,S>& p) { os << '(' << p.first << ',' << p.second << ')'; return os; } template<class Iter> void print(Iter beg, Iter end) { for (Iter itr = beg; itr != end; ++itr) { cerr << *itr << ' '; } cerr << '\n'; } class BIT { public: BIT(int n) : n(n), d(n+1,0) { } // index番目にvalを加える void add(int index, ll val) { assert(0 <= index && index < n); ++index; for (int x = index; x <= n; x += x & -x) { d[x] += val; } } // [0, index)の総和 ll sum(int index) { ll ret = 0; for (int x = index; x > 0; x -= x & -x) { ret += d[x]; } return ret; } // [l, r)の総和 ll sum(int l, int r) { l = max(0, l); r = min(r, n); return sum(r) - sum(l); } private: int n; vector<ll> d; }; int n; vector<ll> x, y; int main() { cin >> n; x.resize(n); y.resize(n); for (int i = 0; i < n; ++i) cin >> x[i] >> y[i]; vector<int> ord(n); iota(ALL(ord), 0); ll p = 0, q=0, r=0, s=0; { sort(ALL(ord), [](int a, int b) { return y[a] < y[b]; }); ll now = -1e18; int cnt = 0; for (int i : ord) { if (y[i] == now) { ++cnt; } else { q += ll(n - cnt) * cnt; now = y[i]; cnt = 1; } } q += ll(n - cnt) * cnt; assert(q % 2 == 0); q /= 2; dbg(q); } { sort(ALL(ord), [](int a, int b) { return x[a] < x[b]; }); ll now = -1e18; int cnt = 0; for (int i : ord) { if (x[i] == now) { ++cnt; } else { p += cnt * ll(n - cnt); now = x[i]; cnt = 1; } } p += cnt * ll(n - cnt); assert(p % 2 == 0); p /= 2; dbg(p); } { auto tmp = y; sort(ALL(tmp)); tmp.erase(unique(ALL(tmp)), tmp.end()); for (int i = 0; i < n; ++i) y[i] = lower_bound(ALL(tmp), y[i]) - tmp.begin(); BIT bit(tmp.size()); vector<int> add; ll now = 1e18; for (int i : ord) { if (x[i] == now) { add.push_back(y[i]); } else { for (int j : add) { bit.add(j, 1); } add.clear(); now = x[i]; add.push_back(y[i]); } r += bit.sum(0, y[i]); s += bit.sum(y[i]+1, tmp.size()); } dbg(r) dbg(s) } double ans = (r - s) / (sqrt(p) * sqrt(q)); cout << fixed << setprecision(20) << ans << '\n'; }