結果
問題 | No.2873 Kendall's Tau |
ユーザー |
![]() |
提出日時 | 2024-09-09 10:39:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 157 ms / 4,500 ms |
コード長 | 1,951 bytes |
コンパイル時間 | 1,163 ms |
コンパイル使用メモリ | 77,780 KB |
最終ジャッジ日時 | 2025-02-24 06:17:05 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:78:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 78 | scanf("%d", &n); | ~~~~~^~~~~~~~~~ main.cpp:79:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 79 | for (int i = 0; i < n; i++) scanf("%d%d", xs + i, ys + i); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
/* -*- coding: utf-8 -*-** 2873.cc: No.2873 Kendall's Tau - yukicoder*/#include<cstdio>#include<cmath>#include<vector>#include<algorithm>#include<utility>using namespace std;/* constant */const int MAX_N = 200000;/* typedef */using ll = long long;using pii = pair<int,int>;template <typename T>struct BIT {int n;vector<T> bits;BIT() {}BIT(int _n) { init(_n); }void init(int _n) {n = _n;bits.assign(n + 1, 0);}T sum(int x) {x = min(x, n);T s = 0;while (x > 0) {s += bits[x];x -= (x & -x);}return s;}void add(int x, T v) {if (x <= 0) return;while (x <= n) {bits[x] += v;x += (x & -x);}}};/* global variables */int xs[MAX_N], ys[MAX_N], uys[MAX_N];pii xys[MAX_N];BIT<int> bit;/* subroutines */ll calcr(int n, int xs[]) {sort(xs, xs + n);ll r = 0;for (int i = 0; i < n;) {int j = i;while (i < n && xs[j] == xs[i]) i++;r += (ll)(n - (i - j)) * (i - j);}return r / 2;}/* main */int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) scanf("%d%d", xs + i, ys + i);copy(ys, ys + n, uys);sort(uys, uys + n);int m = unique(uys, uys + n) - uys;for (int i = 0; i < n; i++)ys[i] = lower_bound(uys, uys + m, ys[i]) - uys;for (int i = 0; i < n; i++) xys[i] = {xs[i], ys[i]};sort(xys, xys + n);bit.init(m);ll p = 0, q = 0;for (int i = 0; i < n;) {int j = i;while (i < n && xys[j].first == xys[i].first) {auto [xi, yi] = xys[i++];p += bit.sum(yi);q += j - bit.sum(yi + 1);}while (j < i) {auto [xj, yj] = xys[j++];bit.add(yj + 1, 1);}}//printf(" p=%lld, q=%lld\n", p, q);ll r = calcr(n, xs);ll s = calcr(n, ys);//printf(" r=%lld, s=%lld\n", r, s);double tau = (double)(p - q) / (sqrt(r) * sqrt(s));printf("%.10lf\n", tau);return 0;}