提出 #36436734


ソースコード 拡げる

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Numerics;

namespace Tasks
{
    public class D
    {
        public static void Main()
        {
            using var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false };
            Console.SetOut(sw);
            Solve();
            Console.Out.Flush();
        }

        public static void Solve()
        {
            var (N, M) = Scanner.Scan<int, int>();
            var A = Scanner.ScanEnumerable<int>().ToArray();
            var sum = A.Select(x => (long)x).Sum();
            var dict = new Dictionary<int, long>();
            foreach (var a in A)
            {
                var b = a % M;
                if (!dict.ContainsKey(b)) dict[b] = 0;
                dict[b] += a;
            }

            var K = dict.Count;
            var keys = dict.Keys.ToArray();
            var (map, remap) = Compress(keys);
            var dsu = new DisjointSetUnion(K);

            foreach (var key in keys)
            {
                var next = (key + 1) % M;
                if (dict.ContainsKey(next))
                {
                    dsu.Merge(map[key], map[next]);
                }
            }

            const long inf = (long)1e18;
            var answer = inf;
            foreach (var group in dsu.GetGroups())
            {
                answer = Math.Min(answer, sum - group.Select(x => dict[remap[x]]).Sum());
            }

            Console.WriteLine(answer);
        }

        public static (Dictionary<T, int> Map, Dictionary<int, T> ReMap) Compress<T>(IEnumerable<T> source)
        {
            var distinct = source.Distinct().ToArray();
            Array.Sort(distinct);
            var map = new Dictionary<T, int>();
            var remap = new Dictionary<int, T>();
            foreach (var (x, i) in distinct.Select((x, i) => (x, i)))
            {
                map[x] = i;
                remap[i] = x;
            }
            return (map, remap);
        }

        public class DisjointSetUnion
        {
            public int Length { get; }
            private readonly int[] _parentOrSize;
            public DisjointSetUnion(int length)
            {
                if (length < 0) throw new ArgumentOutOfRangeException(nameof(length));
                Length = length;
                _parentOrSize = new int[Length];
                Array.Fill(_parentOrSize, -1);
            }
            public int Merge(int u, int v)
            {
                if (u < 0 || Length <= u) throw new ArgumentOutOfRangeException(nameof(u));
                if (v < 0 || Length <= v) throw new ArgumentOutOfRangeException(nameof(v));
                var (x, y) = (LeaderOf(u), LeaderOf(v));
                if (x == y) return x;
                if (-_parentOrSize[x] < -_parentOrSize[y]) (x, y) = (y, x);
                _parentOrSize[x] += _parentOrSize[y];
                _parentOrSize[y] = x;
                return x;
            }
            public bool IsSame(int u, int v)
            {
                if (u < 0 || Length <= u) throw new ArgumentOutOfRangeException(nameof(u));
                if (v < 0 || Length <= v) throw new ArgumentOutOfRangeException(nameof(v));
                return LeaderOf(u) == LeaderOf(v);
            }
            public int LeaderOf(int v)
            {
                if (v < 0 || Length <= v) throw new ArgumentOutOfRangeException(nameof(v));
                if (_parentOrSize[v] < 0) return v;
                return _parentOrSize[v] = LeaderOf(_parentOrSize[v]);
            }
            public int SizeOf(int v)
            {
                if (v < 0 || Length <= v) throw new ArgumentOutOfRangeException(nameof(v));
                return -_parentOrSize[LeaderOf(v)];
            }
            public IEnumerable<IReadOnlyCollection<int>> GetGroups()
            {
                var result = new List<int>[Length].Select(x => new List<int>()).ToArray();
                for (var i = 0; i < Length; i++) result[LeaderOf(i)].Add(i);
                return result.Where(x => x.Count > 0);
            }
        }

        public static class Scanner
        {
            public static string ScanLine() => Console.ReadLine()?.Trim() ?? string.Empty;
            public static string[] Scan() => ScanLine().Split(' ');
            public static T Scan<T>() where T : IConvertible => Convert<T>(Scan()[0]);
            public static (T1, T2) Scan<T1, T2>() where T1 : IConvertible where T2 : IConvertible
            {
                var line = Scan();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]));
            }
            public static (T1, T2, T3) Scan<T1, T2, T3>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible
            {
                var line = Scan();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]));
            }
            public static (T1, T2, T3, T4) Scan<T1, T2, T3, T4>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible where T4 : IConvertible
            {
                var line = Scan();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]), Convert<T4>(line[3]));
            }
            public static (T1, T2, T3, T4, T5) Scan<T1, T2, T3, T4, T5>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible where T4 : IConvertible where T5 : IConvertible
            {
                var line = Scan();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]), Convert<T4>(line[3]), Convert<T5>(line[4]));
            }
            public static (T1, T2, T3, T4, T5, T6) Scan<T1, T2, T3, T4, T5, T6>() where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible where T4 : IConvertible where T5 : IConvertible where T6 : IConvertible
            {
                var line = Scan();
                return (Convert<T1>(line[0]), Convert<T2>(line[1]), Convert<T3>(line[2]), Convert<T4>(line[3]), Convert<T5>(line[4]), Convert<T6>(line[5]));
            }
            public static IEnumerable<T> ScanEnumerable<T>() where T : IConvertible => Scan().Select(Convert<T>);
            private static T Convert<T>(string value) where T : IConvertible => (T)System.Convert.ChangeType(value, typeof(T));
        }
    }
}

提出情報

提出日時
問題 D - Takahashi's Solitaire
ユーザ AconCavy
言語 C# (.NET Core 3.1.201)
得点 400
コード長 6559 Byte
結果 AC
実行時間 315 ms
メモリ 96044 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 400 / 400
結果
AC × 3
AC × 40
セット名 テストケース
Sample example0.txt, example1.txt, example2.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, 036.txt, example0.txt, example1.txt, example2.txt
ケース名 結果 実行時間 メモリ
000.txt AC 87 ms 28164 KiB
001.txt AC 135 ms 43604 KiB
002.txt AC 131 ms 49812 KiB
003.txt AC 278 ms 81236 KiB
004.txt AC 272 ms 81388 KiB
005.txt AC 268 ms 81656 KiB
006.txt AC 277 ms 81140 KiB
007.txt AC 131 ms 49972 KiB
008.txt AC 129 ms 43680 KiB
009.txt AC 132 ms 43436 KiB
010.txt AC 94 ms 29992 KiB
011.txt AC 189 ms 60556 KiB
012.txt AC 279 ms 91144 KiB
013.txt AC 315 ms 95764 KiB
014.txt AC 313 ms 92388 KiB
015.txt AC 311 ms 96044 KiB
016.txt AC 311 ms 92080 KiB
017.txt AC 311 ms 92284 KiB
018.txt AC 299 ms 92396 KiB
019.txt AC 128 ms 43916 KiB
020.txt AC 132 ms 45928 KiB
021.txt AC 129 ms 46228 KiB
022.txt AC 136 ms 49336 KiB
023.txt AC 185 ms 57556 KiB
024.txt AC 266 ms 80792 KiB
025.txt AC 267 ms 82464 KiB
026.txt AC 268 ms 82796 KiB
027.txt AC 260 ms 82088 KiB
028.txt AC 269 ms 81716 KiB
029.txt AC 274 ms 82004 KiB
030.txt AC 270 ms 81824 KiB
031.txt AC 286 ms 81428 KiB
032.txt AC 275 ms 80316 KiB
033.txt AC 275 ms 81904 KiB
034.txt AC 267 ms 81188 KiB
035.txt AC 266 ms 81008 KiB
036.txt AC 269 ms 81540 KiB
example0.txt AC 91 ms 28432 KiB
example1.txt AC 90 ms 28500 KiB
example2.txt AC 91 ms 28400 KiB