結果
問題 | No.945 YKC饅頭 |
ユーザー | EmKjp |
提出日時 | 2019-12-12 00:31:08 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 892 ms / 2,000 ms |
コード長 | 19,567 bytes |
コンパイル時間 | 1,149 ms |
コンパイル使用メモリ | 116,872 KB |
実行使用メモリ | 47,984 KB |
最終ジャッジ日時 | 2024-06-24 08:11:46 |
合計ジャッジ時間 | 25,704 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 32 ms
26,620 KB |
testcase_01 | AC | 33 ms
24,560 KB |
testcase_02 | AC | 34 ms
24,372 KB |
testcase_03 | AC | 34 ms
22,452 KB |
testcase_04 | AC | 34 ms
24,192 KB |
testcase_05 | AC | 34 ms
22,200 KB |
testcase_06 | AC | 35 ms
26,348 KB |
testcase_07 | AC | 33 ms
22,060 KB |
testcase_08 | AC | 33 ms
26,368 KB |
testcase_09 | AC | 33 ms
24,176 KB |
testcase_10 | AC | 35 ms
24,172 KB |
testcase_11 | AC | 34 ms
24,064 KB |
testcase_12 | AC | 34 ms
24,496 KB |
testcase_13 | AC | 34 ms
24,588 KB |
testcase_14 | AC | 34 ms
24,204 KB |
testcase_15 | AC | 33 ms
26,368 KB |
testcase_16 | AC | 34 ms
24,560 KB |
testcase_17 | AC | 34 ms
24,236 KB |
testcase_18 | AC | 34 ms
26,472 KB |
testcase_19 | AC | 35 ms
26,620 KB |
testcase_20 | AC | 33 ms
24,304 KB |
testcase_21 | AC | 33 ms
26,376 KB |
testcase_22 | AC | 36 ms
24,432 KB |
testcase_23 | AC | 35 ms
24,224 KB |
testcase_24 | AC | 34 ms
24,308 KB |
testcase_25 | AC | 35 ms
26,480 KB |
testcase_26 | AC | 35 ms
24,560 KB |
testcase_27 | AC | 34 ms
24,368 KB |
testcase_28 | AC | 33 ms
24,432 KB |
testcase_29 | AC | 31 ms
24,176 KB |
testcase_30 | AC | 33 ms
24,304 KB |
testcase_31 | AC | 110 ms
28,812 KB |
testcase_32 | AC | 306 ms
33,520 KB |
testcase_33 | AC | 387 ms
37,276 KB |
testcase_34 | AC | 345 ms
38,464 KB |
testcase_35 | AC | 632 ms
42,604 KB |
testcase_36 | AC | 228 ms
32,884 KB |
testcase_37 | AC | 225 ms
34,156 KB |
testcase_38 | AC | 254 ms
35,640 KB |
testcase_39 | AC | 276 ms
33,952 KB |
testcase_40 | AC | 372 ms
32,872 KB |
testcase_41 | AC | 258 ms
30,996 KB |
testcase_42 | AC | 420 ms
38,900 KB |
testcase_43 | AC | 198 ms
33,652 KB |
testcase_44 | AC | 508 ms
40,156 KB |
testcase_45 | AC | 382 ms
40,180 KB |
testcase_46 | AC | 166 ms
28,380 KB |
testcase_47 | AC | 377 ms
39,072 KB |
testcase_48 | AC | 88 ms
30,524 KB |
testcase_49 | AC | 297 ms
32,312 KB |
testcase_50 | AC | 419 ms
37,124 KB |
testcase_51 | AC | 724 ms
47,844 KB |
testcase_52 | AC | 723 ms
47,984 KB |
testcase_53 | AC | 715 ms
47,592 KB |
testcase_54 | AC | 718 ms
47,728 KB |
testcase_55 | AC | 747 ms
47,844 KB |
testcase_56 | AC | 450 ms
35,936 KB |
testcase_57 | AC | 248 ms
38,228 KB |
testcase_58 | AC | 832 ms
40,556 KB |
testcase_59 | AC | 892 ms
45,160 KB |
testcase_60 | AC | 647 ms
35,236 KB |
testcase_61 | AC | 850 ms
40,812 KB |
testcase_62 | AC | 843 ms
44,148 KB |
testcase_63 | AC | 208 ms
37,620 KB |
testcase_64 | AC | 680 ms
40,272 KB |
testcase_65 | AC | 621 ms
39,152 KB |
testcase_66 | AC | 602 ms
41,428 KB |
testcase_67 | AC | 772 ms
45,544 KB |
testcase_68 | AC | 668 ms
38,968 KB |
testcase_69 | AC | 393 ms
38,904 KB |
testcase_70 | AC | 446 ms
35,732 KB |
testcase_71 | AC | 453 ms
37,668 KB |
testcase_72 | AC | 720 ms
43,456 KB |
testcase_73 | AC | 865 ms
44,672 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using E = System.Linq.Enumerable; internal partial class Solver { class Query { public int Left, Right, Id; public int Kind; } int ToIndex(string s) { if (s == "Y") return 0; if (s == "K") return 1; if (s == "C") return 2; throw new NotSupportedException(); } public void Run() { var N = ni(); var M = ni(); var Q = new Query[M]; for (int i = 0; i < M; i++) { var query = new Query { Id = i, Left = ni() - 1, Right = ni() - 1, Kind = ToIndex(ns()), }; Q[i] = query; } var set = new MultiSet<int>(); for (int i = 0; i < N; i++) { set.Add(i); } var ans = new int[3]; foreach (var q in Q) { var index = set.IndexOfLowerBound(q.Left); var iter = set.AtIterator(index); while (!iter.IsEndOf(set) && iter.Value <= q.Right) { ans[q.Kind]++; set.Remove((iter++).Value); } } cout.WriteLine(string.Join(" ", ans)); } } public partial class Set<T> : MultiSet<T> { protected override bool AllowMultiple { get { return false; } } } public partial class MultiSet<T> { internal readonly LLRBTreeNode<T> end = new LLRBTreeNode<T>(default(T)); private LLRBTreeNode<T> root = null; private readonly IComparer<T> _comparer; public MultiSet() : this(Comparer<T>.Default) { } public MultiSet(IComparer<T> comparer) { _comparer = comparer; root = end; } public MultiSet(Comparison<T> comp) : this(Comparer<T>.Create(comp)) { } protected virtual bool AllowMultiple { get { return true; } } public int Count { get { return root == null ? 0 : root.Count + root.LeftTotalCount + root.RightTotalCount - 1; } } private LLRBTreeNode<T> FindNode(T value) { var node = root; while (node != null) { int cmp = Compare(value, node); if (cmp == 0) { return node; } node = (cmp < 0) ? node.Left : node.Right; } return null; } public void Clear() { root = end; } public bool Contains(T value) { var node = FindNode(value); return node != null; } public int CountOf(T value) { var node = FindNode(value); return node != null ? node.Count : 0; } public int IndexOfLowerBound(T value) { var node = root; int index = 0; while (node != null) { int cmp = Compare(value, node); if (cmp <= 0) { node = node.Left; } else { index += node.LeftTotalCount + node.Count; node = node.Right; } } return index; } private int Compare(T value, LLRBTreeNode<T> node) { if (node == end) { return -1; } return _comparer.Compare(value, node.Value); } public int IndexOfUpperBound(T value) { var node = root; int index = 0; while (node != null) { int cmp = Compare(value, node); if (cmp < 0) { node = node.Left; } else { index += node.LeftTotalCount + node.Count; node = node.Right; } } return index; } public T At(int index) { var node = root; while (node != null) { int leftCount = node.LeftTotalCount; if (leftCount <= index && index < leftCount + node.Count) { return node.Value; } if (index < leftCount) { node = node.Left; } else { index -= leftCount + node.Count; node = node.Right; } } throw new ArgumentOutOfRangeException("index"); } public T Min() { return At(0); } public T Max() { return At(Count - 1); } public LLRBTreeIterator<T> AtIterator(int index) { var node = root; while (node != null) { int leftCount = node.LeftTotalCount; if (leftCount <= index && index < leftCount + node.Count) { return new LLRBTreeIterator<T>(node, index - leftCount); } if (index < leftCount) { node = node.Left; } else { index -= leftCount + node.Count; node = node.Right; } } throw new ArgumentOutOfRangeException("index"); } public void Add(T value) { root = Add(root, value); root.Color = LLRBTreeNode<T>.BLACK; } private LLRBTreeNode<T> Add(LLRBTreeNode<T> h, T value) { if (h == null) { return new LLRBTreeNode<T>(value); } int cmp = Compare(value, h); if (cmp == 0) { if (AllowMultiple) { h.Count++; FixCount(h); } } else if (cmp <= 0) { h.Left = Add(h.Left, value); FixCount(h); } else { h.Right = Add(h.Right, value); FixCount(h); } if (IsRed(h.Right) && !IsRed(h.Left)) { h = RotateLeft(h); } if (IsRed(h.Left) && IsRed(h.Left.Left)) { h = RotateRight(h); } if (IsRed(h.Left) && IsRed(h.Right)) { ColorFlip(h); } return h; } private LLRBTreeNode<T> RemoveLeftestNode(LLRBTreeNode<T> h, out LLRBTreeNode<T> leftMost) { if (h.Left == null) { leftMost = h; return null; } if (!IsRed(h.Left) && !IsRed(h.Left.Left)) { h = MoveRedLeft(h); } h.Left = RemoveLeftestNode(h.Left, out leftMost); return FixUp(h); } private bool TryReduceCount(LLRBTreeNode<T> h, T value, out int num) { num = 0; if (h == null) { return false; } int cmp = Compare(value, h); if (cmp == 0) { num = h.Count; if (h.Count > 1) { h.Count--; FixCount(h); return true; } return false; } if (TryReduceCount((cmp < 0) ? h.Left : h.Right, value, out num)) { FixCount(h); return true; } return false; } public bool Remove(T value) { if (AllowMultiple) { int num; if (TryReduceCount(root, value, out num)) { return true; } if (num == 0) { return false; } } else { if (!Contains(value)) { return false; } } root = RemoveNode(root, value); if (root != null) { root.Color = LLRBTreeNode<T>.BLACK; } return true; } private LLRBTreeNode<T> RemoveNode(LLRBTreeNode<T> h, T value) { if (Compare(value, h) < 0) { if (h.Left == null) { throw new KeyNotFoundException("value"); } if (!IsRed(h.Left) && !IsRed(h.Left.Left)) { h = MoveRedLeft(h); } h.Left = RemoveNode(h.Left, value); FixCount(h); } else { if (IsRed(h.Left)) { h = RotateRight(h); } if (h.Right == null) { if (Compare(value, h) == 0) { return null; } throw new KeyNotFoundException("value"); } if (!IsRed(h.Right) && !IsRed(h.Right.Left)) { h = MoveRedRight(h); } if (Compare(value, h) == 0) { LLRBTreeNode<T> sub; h.Right = RemoveLeftestNode(h.Right, out sub); h = Substitute(h, sub); FixCount(h); } else { h.Right = RemoveNode(h.Right, value); FixCount(h); } } return FixUp(h); } private LLRBTreeNode<T> Substitute(LLRBTreeNode<T> node, LLRBTreeNode<T> sub) { sub.Parent = node.Parent; sub.Left = node.Left; sub.Right = node.Right; sub.TotalCount = node.TotalCount; sub.Color = node.Color; if (sub.Parent != null) { if (sub.Parent.Left == node) { sub.Parent.Left = sub; } if (sub.Parent.Right == node) { sub.Parent.Right = sub; } } if (sub.Left != null) { sub.Left.Parent = sub; } if (sub.Right != null) { sub.Right.Parent = sub; } return sub; } private static LLRBTreeNode<T> MoveRedLeft(LLRBTreeNode<T> h) { ColorFlip(h); if (IsRed(h.Right.Left)) { h.Right = RotateRight(h.Right); FixCount(h); h = RotateLeft(h); ColorFlip(h); } return h; } private static LLRBTreeNode<T> MoveRedRight(LLRBTreeNode<T> h) { ColorFlip(h); if (IsRed(h.Left.Left)) { h = RotateRight(h); ColorFlip(h); } return h; } private static LLRBTreeNode<T> RotateLeft(LLRBTreeNode<T> h) { var x = h.Right; h.Right = x.Left; x.Left = h; x.Color = h.Color; h.Color = LLRBTreeNode<T>.RED; FixCount(h); FixCount(x); return x; } private static LLRBTreeNode<T> RotateRight(LLRBTreeNode<T> h) { var x = h.Left; h.Left = x.Right; x.Right = h; x.Color = h.Color; h.Color = LLRBTreeNode<T>.RED; FixCount(h); FixCount(x); return x; } private static bool IsRed(LLRBTreeNode<T> h) { return h != null && h.Color == LLRBTreeNode<T>.RED; } private static void ColorFlip(LLRBTreeNode<T> h) { h.Color = !h.Color; h.Left.Color = !h.Left.Color; h.Right.Color = !h.Right.Color; } private static LLRBTreeNode<T> FixUp(LLRBTreeNode<T> h) { if (IsRed(h.Right)) { h = RotateLeft(h); } if (h.Left != null && IsRed(h.Left) && IsRed(h.Left.Left)) { h = RotateRight(h); } if (IsRed(h.Left) && IsRed(h.Right)) { ColorFlip(h); } FixCount(h); return h; } private static void FixCount(LLRBTreeNode<T> node) { node.TotalCount = node.Count + node.LeftTotalCount + node.RightTotalCount; } public void Debug() { if (root != null) { root.Debug(); } } } public class LLRBTreeNode<T> { public const bool RED = true; public const bool BLACK = false; public T Value; public bool Color = RED; public LLRBTreeNode<T> Parent { get; set; } private LLRBTreeNode<T> _left; private LLRBTreeNode<T> _right; public LLRBTreeNode<T> Left { get { return _left; } set { if (_left != null && _left.Parent == this) { _left.Parent = null; } _left = value; if (_left != null) { _left.Parent = this; } } } public LLRBTreeNode<T> Right { get { return _right; } set { if (_right != null && _right.Parent == this) { _right.Parent = null; } _right = value; if (_right != null) { _right.Parent = this; } } } public int Count = 1; public LLRBTreeNode(T value) { Value = value; } public int TotalCount = 1; public int LeftTotalCount { get { return Left == null ? 0 : Left.TotalCount; } } public int RightTotalCount { get { return Right == null ? 0 : Right.TotalCount; } } public void Debug(string indent = "") { Console.WriteLine(indent + ":" + Value + " - " + Count + " - " + TotalCount); if (Left != null) { if (Left.Parent != this) Console.WriteLine("Missing Parent"); Left.Debug(indent + "L"); } if (Right != null) { if (Right.Parent != this) Console.WriteLine("Missing Parent"); Right.Debug(indent + "R"); } } } public struct LLRBTreeIterator<T> { private readonly LLRBTreeNode<T> _node; private readonly int _index; public LLRBTreeIterator(LLRBTreeNode<T> node, int index = 0) { _node = node; _index = index; } public T Value { get { return _node.Value; } } public static LLRBTreeIterator<T> operator ++(LLRBTreeIterator<T> x) { return x.GetSuccessor(); } public static LLRBTreeIterator<T> operator --(LLRBTreeIterator<T> x) { return x.GetPredecessor(); } public bool IsEndOf(MultiSet<T> set) { return set.end == _node; } private LLRBTreeIterator<T> GetSuccessor() { if (_index + 1 < _node.Count) { return new LLRBTreeIterator<T>(_node, _index + 1); } else { LLRBTreeNode<T> current, parent; if (_node.Right == null) { for (current = _node, parent = _node.Parent; parent.Right == current; current = parent, parent = current.Parent) { ; } return new LLRBTreeIterator<T>(parent); } else { for (parent = _node.Right, current = parent.Left; current != null; parent = current, current = parent.Left) { ; } return new LLRBTreeIterator<T>(parent); } } } private LLRBTreeIterator<T> GetPredecessor() { if (0 <= _index - 1) { return new LLRBTreeIterator<T>(_node, _index - 1); } else { LLRBTreeNode<T> current, parent; if (_node.Left == null) { for (current = _node, parent = _node.Parent; parent.Left == current; current = parent, parent = current.Parent) { ; } return new LLRBTreeIterator<T>(parent, parent.Count - 1); } else { for (parent = _node.Left, current = parent.Right; current != null; parent = current, current = parent.Right) { ; } return new LLRBTreeIterator<T>(parent, parent.Count - 1); } } } } public partial class MultiSet<T> : IEnumerable<T> { public IEnumerator<T> GetEnumerator() { var node = root; var stack = new Stack<LLRBTreeNode<T>>(); while (node != null || stack.Count > 0) { while (node != null) { stack.Push(node); node = node.Left; } node = stack.Pop(); if (node == end) { break; } int count = node.Count; for (int i = 0; i < count; i++) { yield return node.Value; } node = node.Right; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } // PREWRITEN CODE BEGINS FROM HERE internal partial class Solver : Scanner { public static void Main(string[] args) { #if LOCAL byte[] inputBuffer = new byte[1000000]; var inputStream = Console.OpenStandardInput(inputBuffer.Length); using (var reader = new StreamReader(inputStream, Console.InputEncoding, false, inputBuffer.Length)) { Console.SetIn(reader); new Solver(Console.In, Console.Out).Run(); } #else Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); new Solver(Console.In, Console.Out).Run(); Console.Out.Flush(); #endif } #pragma warning disable IDE0052 private readonly TextReader cin; private readonly TextWriter cout; #pragma warning restore IDE0052 public Solver(TextReader reader, TextWriter writer) : base(reader) { cin = reader; cout = writer; } public Solver(string input, TextWriter writer) : this(new StringReader(input), writer) { } #pragma warning disable IDE1006 #pragma warning disable IDE0051 private int ni() { return NextInt(); } private int[] ni(int n) { return NextIntArray(n); } private long nl() { return NextLong(); } private long[] nl(int n) { return NextLongArray(n); } private double nd() { return NextDouble(); } private double[] nd(int n) { return NextDoubleArray(n); } private string ns() { return Next(); } private string[] ns(int n) { return NextArray(n); } #pragma warning restore IDE1006 #pragma warning restore IDE0051 } internal static class LinqPadExtension { public static T Dump<T>(this T obj) { #if LOCAL return LINQPad.Extensions.Dump(obj); #else return obj; #endif } } public class Scanner { private readonly TextReader Reader; private readonly Queue<string> TokenQueue = new Queue<string>(); private readonly CultureInfo ci = CultureInfo.InvariantCulture; public Scanner() : this(Console.In) { } public Scanner(TextReader reader) { Reader = reader; } public int NextInt() { return int.Parse(Next(), ci); } public long NextLong() { return long.Parse(Next(), ci); } public double NextDouble() { return double.Parse(Next(), ci); } public string[] NextArray(int size) { string[] array = new string[size]; for (int i = 0; i < size; i++) { array[i] = Next(); } return array; } public int[] NextIntArray(int size) { int[] array = new int[size]; for (int i = 0; i < size; i++) { array[i] = NextInt(); } return array; } public long[] NextLongArray(int size) { long[] array = new long[size]; for (int i = 0; i < size; i++) { array[i] = NextLong(); } return array; } public double[] NextDoubleArray(int size) { double[] array = new double[size]; for (int i = 0; i < size; i++) { array[i] = NextDouble(); } return array; } public string Next() { if (TokenQueue.Count == 0) { if (!StockTokens()) { throw new InvalidOperationException(); } } return TokenQueue.Dequeue(); } public bool HasNext() { if (TokenQueue.Count > 0) { return true; } return StockTokens(); } private static readonly char[] _separator = new[] { ' ', '\t' }; private bool StockTokens() { while (true) { string line = Reader.ReadLine(); if (line == null) { return false; } string[] tokens = line.Split(_separator, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length == 0) { continue; } foreach (string token in tokens) { TokenQueue.Enqueue(token); } return true; } } }