結果
問題 | No.2873 Kendall's Tau |
ユーザー | kakel-san |
提出日時 | 2024-10-14 23:21:14 |
言語 | C# (.NET 8.0.203) |
結果 |
AC
|
実行時間 | 640 ms / 4,500 ms |
コード長 | 3,962 bytes |
コンパイル時間 | 15,480 ms |
コンパイル使用メモリ | 165,420 KB |
実行使用メモリ | 237,872 KB |
最終ジャッジ日時 | 2024-10-14 23:21:48 |
合計ジャッジ時間 | 28,561 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 56 ms
31,104 KB |
testcase_01 | AC | 58 ms
30,848 KB |
testcase_02 | AC | 57 ms
30,976 KB |
testcase_03 | AC | 60 ms
30,944 KB |
testcase_04 | AC | 59 ms
31,232 KB |
testcase_05 | AC | 57 ms
30,848 KB |
testcase_06 | AC | 57 ms
31,104 KB |
testcase_07 | AC | 549 ms
88,744 KB |
testcase_08 | AC | 633 ms
90,732 KB |
testcase_09 | AC | 563 ms
88,876 KB |
testcase_10 | AC | 640 ms
91,268 KB |
testcase_11 | AC | 540 ms
88,500 KB |
testcase_12 | AC | 632 ms
90,292 KB |
testcase_13 | AC | 233 ms
63,484 KB |
testcase_14 | AC | 518 ms
90,292 KB |
testcase_15 | AC | 151 ms
50,560 KB |
testcase_16 | AC | 152 ms
50,560 KB |
testcase_17 | AC | 440 ms
86,148 KB |
testcase_18 | AC | 367 ms
84,856 KB |
testcase_19 | AC | 443 ms
82,512 KB |
testcase_20 | AC | 154 ms
51,200 KB |
testcase_21 | AC | 354 ms
79,044 KB |
testcase_22 | AC | 194 ms
56,064 KB |
testcase_23 | AC | 400 ms
79,320 KB |
testcase_24 | AC | 109 ms
41,344 KB |
testcase_25 | AC | 153 ms
49,280 KB |
testcase_26 | AC | 449 ms
85,992 KB |
testcase_27 | AC | 331 ms
77,392 KB |
testcase_28 | AC | 478 ms
78,752 KB |
testcase_29 | AC | 535 ms
93,732 KB |
testcase_30 | AC | 156 ms
45,056 KB |
testcase_31 | AC | 186 ms
55,296 KB |
testcase_32 | AC | 351 ms
237,872 KB |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (101 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var n = NN; var map = NArr(n); var p = 0L; var q = 0L; var r = (long)n * (n - 1) / 2; var s = r; var xset = new HashSet<int>(); var yset = new HashSet<int>(); var rdic = new Dictionary<int, int>(); var sdic = new Dictionary<int, int>(); foreach (var pt in map) { xset.Add(pt[0]); yset.Add(pt[1]); if (rdic.ContainsKey(pt[0])) ++rdic[pt[0]]; else rdic[pt[0]] = 1; if (sdic.ContainsKey(pt[1])) ++sdic[pt[1]]; else sdic[pt[1]] = 1; } foreach (var ri in rdic) r -= (long)ri.Value * (ri.Value - 1) / 2; foreach (var si in sdic) s -= (long)si.Value * (si.Value - 1) / 2; var xlist = new List<int>(xset); xlist.Sort(); var ylist = new List<int>(yset); ylist.Sort(); var xdic = new Dictionary<int, int>(); for (var i = 0; i < xlist.Count; ++i) xdic[xlist[i]] = i; var ydic = new Dictionary<int, int>(); for (var i = 0; i < ylist.Count; ++i) ydic[ylist[i]] = i; var plist = new List<int>[ylist.Count]; for (var i = 0; i < plist.Length; ++i) plist[i] = new List<int>(); for (var i = 0; i < n; ++i) { plist[ydic[map[i][1]]].Add(xdic[map[i][0]]); } var pft = new FenwickTree(xlist.Count); var mft = new FenwickTree(xlist.Count); for (var i = 0; i < plist.Length; ++i) { foreach (var x in plist[i]) pft.Add(x, 1); } for (var i = 0; i < plist.Length; ++i) { foreach (var x in plist[i]) pft.Add(x, -1); foreach (var x in plist[i]) { p += pft.Sum(xlist.Count - 1) - pft.Sum(x); if (x > 0) p += mft.Sum(x - 1); q += mft.Sum(xlist.Count - 1) - mft.Sum(x); if (x > 0) q += pft.Sum(x - 1); } } WriteLine((p - q) / Math.Sqrt(r) / Math.Sqrt(s)); } class FenwickTree { int size; long[] tree; public FenwickTree(int size) { this.size = size; tree = new long[size + 2]; } public void Add(int index, int value) { ++index; for (var x = index; x <= size; x += (x & -x)) tree[x] += value; } /// <summary>先頭からindexまでの和(include index)</summary> public long Sum(int index) { if (index < 0) return 0; ++index; var sum = 0L; for (var x = index; x > 0; x -= (x & -x)) sum += tree[x]; return sum; } public long Get(int index) { if (index == 0) return Sum(0); return Sum(index) - Sum(index - 1); } /// <summary>Sum(x) >= value となる最小のxを求める</summary> // 各要素は非負であること public int LowerBound(long value) { if (value < 0) return -1; var x = 0; var b = 1; while (b * 2 <= size) b <<= 1; for (var k = b; k > 0; k >>= 1) { if (x + k <= size && tree[x + k] < value) { value -= tree[x + k]; x += k; } } return x; } } }