結果
問題 | No.1997 X Lighting |
ユーザー | kakel-san |
提出日時 | 2023-10-01 22:07:47 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 446 ms / 2,000 ms |
コード長 | 4,499 bytes |
コンパイル時間 | 4,214 ms |
コンパイル使用メモリ | 109,568 KB |
実行使用メモリ | 60,644 KB |
最終ジャッジ日時 | 2024-07-26 13:32:58 |
合計ジャッジ時間 | 10,580 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 39 ms
20,352 KB |
testcase_01 | AC | 39 ms
20,736 KB |
testcase_02 | AC | 39 ms
20,480 KB |
testcase_03 | AC | 39 ms
20,736 KB |
testcase_04 | AC | 37 ms
20,608 KB |
testcase_05 | AC | 47 ms
22,016 KB |
testcase_06 | AC | 106 ms
26,880 KB |
testcase_07 | AC | 40 ms
20,480 KB |
testcase_08 | AC | 46 ms
22,272 KB |
testcase_09 | AC | 42 ms
21,248 KB |
testcase_10 | AC | 39 ms
20,992 KB |
testcase_11 | AC | 41 ms
20,608 KB |
testcase_12 | AC | 39 ms
20,736 KB |
testcase_13 | AC | 153 ms
28,928 KB |
testcase_14 | AC | 292 ms
55,352 KB |
testcase_15 | AC | 137 ms
40,064 KB |
testcase_16 | AC | 167 ms
40,064 KB |
testcase_17 | AC | 352 ms
53,416 KB |
testcase_18 | AC | 201 ms
41,812 KB |
testcase_19 | AC | 408 ms
58,412 KB |
testcase_20 | AC | 434 ms
60,632 KB |
testcase_21 | AC | 439 ms
60,644 KB |
testcase_22 | AC | 415 ms
58,216 KB |
testcase_23 | AC | 246 ms
48,360 KB |
testcase_24 | AC | 48 ms
21,632 KB |
testcase_25 | AC | 446 ms
59,668 KB |
testcase_26 | AC | 378 ms
53,756 KB |
testcase_27 | AC | 374 ms
54,576 KB |
testcase_28 | AC | 144 ms
39,168 KB |
testcase_29 | AC | 142 ms
38,912 KB |
testcase_30 | AC | 414 ms
59,144 KB |
testcase_31 | AC | 285 ms
50,604 KB |
testcase_32 | AC | 103 ms
34,688 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static long NN => long.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); static long[] NMi => ReadLine().Split().Select(c => long.Parse(c) - 1).ToArray(); static long[][] NMap(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NMi).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, m) = (c[0], c[1]); var map = NMap(m); var pset = new HashSet<long>(); var mset = new HashSet<long>(); var opset = new HashSet<long>(); var omset = new HashSet<long>(); var ecset = new HashSet<long>(); var ocset = new HashSet<long>(); ecset.Add(0); ocset.Add(0); foreach (var mi in map) { pset.Add(mi[0] + mi[1]); mset.Add(mi[0] - mi[1]); if ((mi[0] + mi[1]) % 2 == 0) { ecset.Add(mi[0] + mi[1]); ecset.Add(Math.Abs(mi[0] - mi[1])); ecset.Add(2 * n - 2 - Math.Abs(mi[0] - mi[1])); } else { ocset.Add(mi[0] + mi[1]); ocset.Add(Math.Abs(mi[0] - mi[1])); ocset.Add(2 * n - 2 - Math.Abs(mi[0] - mi[1])); } } var eclist = new List<long>(ecset); eclist.Sort(); var edic = new Dictionary<long, int>(); for (var i = 0; i < eclist.Count; ++i) edic[eclist[i]] = i; var oclist = new List<long>(ocset); oclist.Sort(); var odic = new Dictionary<long, int>(); for (var i = 0; i < oclist.Count; ++i) odic[oclist[i]] = i; var eft = new FenwickTree(eclist.Count); var oft = new FenwickTree(oclist.Count); var ans = 0L; foreach (var plus in pset) { if (plus % 2 == 0) { ans += Math.Min(plus + 1, 2 * n - 1 - plus); // WriteLine($"/: {Math.Min(plus + 1, 2 * n - 1 - plus)}"); eft.Add(edic[plus], 1); } else { ans += Math.Min(plus + 1, 2 * n - 1 - plus); // WriteLine($"/: {Math.Min(plus + 1, 2 * n - 1 - plus)}"); oft.Add(odic[plus], 1); } } foreach (var mi in mset) { var left = Math.Abs(mi); var right = 2 * n - 2 - Math.Abs(mi); if (mi % 2 == 0) { ans += (right - left) / 2 + 1 - eft.Sum(edic[right]) + eft.Sum(edic[left] - 1); // WriteLine($"({right} - {left}) / 2 + 1 - {eft.Sum(edic[right])} + {eft.Sum(edic[left] - 1)}"); } else { ans += (right - left) / 2 + 1 - oft.Sum(odic[right]) + oft.Sum(odic[left] - 1); // WriteLine($"({right} - {left}) / 2 + 1 - {oft.Sum(odic[right])} + {oft.Sum(odic[left] - 1)}"); } } WriteLine(ans); } 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; } /// <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; } } }