結果
問題 | No.1972 Modulo Set |
ユーザー | masayamatu |
提出日時 | 2022-06-17 14:49:49 |
言語 | C# (.NET 8.0.203) |
結果 |
RE
|
実行時間 | - |
コード長 | 7,269 bytes |
コンパイル時間 | 15,707 ms |
コンパイル使用メモリ | 167,704 KB |
実行使用メモリ | 65,536 KB |
最終ジャッジ日時 | 2024-10-08 17:23:18 |
合計ジャッジ時間 | 32,534 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 54 ms
33,664 KB |
testcase_01 | AC | 55 ms
35,584 KB |
testcase_02 | AC | 54 ms
30,336 KB |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | WA | - |
testcase_06 | RE | - |
testcase_07 | RE | - |
testcase_08 | AC | 108 ms
37,732 KB |
testcase_09 | RE | - |
testcase_10 | WA | - |
testcase_11 | RE | - |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | AC | 56 ms
30,720 KB |
testcase_19 | RE | - |
testcase_20 | RE | - |
testcase_21 | RE | - |
testcase_22 | RE | - |
testcase_23 | RE | - |
testcase_24 | RE | - |
testcase_25 | RE | - |
testcase_26 | RE | - |
testcase_27 | RE | - |
testcase_28 | TLE | - |
testcase_29 | TLE | - |
testcase_30 | -- | - |
testcase_31 | -- | - |
testcase_32 | -- | - |
testcase_33 | -- | - |
testcase_34 | -- | - |
testcase_35 | -- | - |
testcase_36 | -- | - |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (89 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 System.Collections; using System.Collections.Generic; using System.Linq; using System.Numerics; using System.Text; //using static CompLib.CompLib; //using DataStructure; namespace atcoder { class Program { const int intMax = 1000000000; const long longMax = 2000000000000000000; static void Main(string[] args) { var NM = Console.ReadLine().Trim().Split().Select(long.Parse).ToArray(); var A = Console.ReadLine().Trim().Split().Select(long.Parse).ToArray(); for (int i = 0; i < NM[0]; i++) { A[i] %= NM[1]; } var list = new Dictionary<long, int>(); var set = new Set<long>(); for (int i = 0; i < NM[0]; i++) { if (!list.ContainsKey(A[i])) { list.Add(A[i], 1); } else { list[A[i]]++; } set.Add(Math.Min(A[i], NM[1] - A[i])); } long ans = NM[0]; for (int i = 0; i < set.Count; i++) { if (set[i] == 0 || set[i] * 2 == NM[1]) { ans -= list[set[i]] - 1; list[set[i]] = 0; } else if (list.ContainsKey(NM[1] - list.ElementAt(i).Key)) { ans -= Math.Min(list[NM[1] - set[i]], list[set[i]]); list[NM[1] - set[i]] = 0; list[set[i]] = 0; } } Console.WriteLine(ans); } } public class Set<T> { Node root; readonly IComparer<T> comparer; readonly Node nil; public bool IsMultiSet { get; set; } public Set(IComparer<T> comparer) { nil = new Node(default(T)); root = nil; this.comparer = comparer; } public Set(Comparison<T> comaprison) : this(Comparer<T>.Create(comaprison)) { } public Set() : this(Comparer<T>.Default) { } public bool Add(T v) { return insert(ref root, v); } public bool Remove(T v) { return remove(ref root, v); } public T this[int index] { get { return find(root, index); } } public int Count { get { return root.Count; } } public void RemoveAt(int k) { if (k < 0 || k >= root.Count) throw new ArgumentOutOfRangeException(); removeAt(ref root, k); } public T[] Items { get { var ret = new T[root.Count]; var k = 0; walk(root, ret, ref k); return ret; } } void walk(Node t, T[] a, ref int k) { if (t.Count == 0) return; walk(t.lst, a, ref k); a[k++] = t.Key; walk(t.rst, a, ref k); } bool insert(ref Node t, T key) { if (t.Count == 0) { t = new Node(key); t.lst = t.rst = nil; t.Update(); return true; } var cmp = comparer.Compare(t.Key, key); bool res; if (cmp > 0) res = insert(ref t.lst, key); else if (cmp == 0) { if (IsMultiSet) res = insert(ref t.lst, key); else return false; } else res = insert(ref t.rst, key); balance(ref t); return res; } bool remove(ref Node t, T key) { if (t.Count == 0) return false; var cmp = comparer.Compare(key, t.Key); bool ret; if (cmp < 0) ret = remove(ref t.lst, key); else if (cmp > 0) ret = remove(ref t.rst, key); else { ret = true; var k = t.lst.Count; if (k == 0) { t = t.rst; return true; } if (t.rst.Count == 0) { t = t.lst; return true; } t.Key = find(t.lst, k - 1); removeAt(ref t.lst, k - 1); } balance(ref t); return ret; } void removeAt(ref Node t, int k) { var cnt = t.lst.Count; if (cnt < k) removeAt(ref t.rst, k - cnt - 1); else if (cnt > k) removeAt(ref t.lst, k); else { if (cnt == 0) { t = t.rst; return; } if (t.rst.Count == 0) { t = t.lst; return; } t.Key = find(t.lst, k - 1); removeAt(ref t.lst, k - 1); } balance(ref t); } void balance(ref Node t) { var balance = t.lst.Height - t.rst.Height; if (balance == -2) { if (t.rst.lst.Height - t.rst.rst.Height > 0) { rotR(ref t.rst); } rotL(ref t); } else if (balance == 2) { if (t.lst.lst.Height - t.lst.rst.Height < 0) rotL(ref t.lst); rotR(ref t); } else t.Update(); } T find(Node t, int k) { if (k < 0 || k > root.Count) throw new ArgumentOutOfRangeException(); for (; ; ) { if (k == t.lst.Count) return t.Key; else if (k < t.lst.Count) t = t.lst; else { k -= t.lst.Count + 1; t = t.rst; } } } public int LowerBound(T v) { var k = 0; var t = root; for (; ; ) { if (t.Count == 0) return k; if (comparer.Compare(v, t.Key) <= 0) t = t.lst; else { k += t.lst.Count + 1; t = t.rst; } } } public int UpperBound(T v) { var k = 0; var t = root; for (; ; ) { if (t.Count == 0) return k; if (comparer.Compare(t.Key, v) <= 0) { k += t.lst.Count + 1; t = t.rst; } else t = t.lst; } } void rotR(ref Node t) { var l = t.lst; t.lst = l.rst; l.rst = t; t.Update(); l.Update(); t = l; } void rotL(ref Node t) { var r = t.rst; t.rst = r.lst; r.lst = t; t.Update(); r.Update(); t = r; } class Node { public Node(T key) { Key = key; } public int Count { get; private set; } public sbyte Height { get; private set; } public T Key { get; set; } public Node lst, rst; public void Update() { Count = 1 + lst.Count + rst.Count; Height = (sbyte)(1 + Math.Max(lst.Height, rst.Height)); } public override string ToString() { return string.Format("Count = {0}, Key = {1}", Count, Key); } } } }