Submission #28962115


Source Code Expand

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

namespace Tasks
{
    public class E
    {
        public static void Main(string[] args)
        {
            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 H = Scanner.ScanEnumerable<long>().ToArray();
            var G = new List<(int, long)>[N].Select(x => new List<(int, long)>()).ToArray();
            for (var i = 0; i < M; i++)
            {
                var (u, v) = Scanner.Scan<int, int>();
                u--; v--;
                G[u].Add((v, Math.Max(0, H[v] - H[u])));
                G[v].Add((u, Math.Max(0, H[u] - H[v])));
            }

            var costs = new long[N];
            Array.Fill(costs, long.MaxValue);
            costs[0] = 0;
            var queue = new PriorityQueue<(int U, long Cost)>((x, y) => x.Cost.CompareTo(y.Cost));
            queue.Enqueue((0, 0));

            while (queue.Count > 0)
            {
                var (u, cu) = queue.Dequeue();
                if (costs[u] < cu) continue;
                foreach (var (v, cv) in G[u])
                {
                    var c = costs[u] + cv;
                    if (costs[v] <= c) continue;
                    costs[v] = c;
                    queue.Enqueue((v, c));
                }
            }

            var answer = 0L;
            for (var i = 0; i < N; i++)
            {
                answer = Math.Max(answer, H[0] - H[i] - costs[i]);
            }

            Console.WriteLine(answer);
        }

        public class PriorityQueue<T> : IReadOnlyCollection<T>
        {
            private readonly Comparison<T> _comparison;
            private readonly List<T> _heap;
            public PriorityQueue(IEnumerable<T> items, IComparer<T> comparer = null) : this(comparer)
            {
                foreach (var item in items) Enqueue(item);
            }
            public PriorityQueue(IEnumerable<T> items, Comparison<T> comparison) : this(comparison)
            {
                foreach (var item in items) Enqueue(item);
            }
            public PriorityQueue(IComparer<T> comparer = null) : this((comparer ?? Comparer<T>.Default).Compare) { }
            public PriorityQueue(Comparison<T> comparison)
            {
                _heap = new List<T>();
                _comparison = comparison;
            }
            public int Count => _heap.Count;
            public IEnumerator<T> GetEnumerator() => _heap.GetEnumerator();
            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
            public void Enqueue(T item)
            {
                var child = Count;
                _heap.Add(item);
                while (child > 0)
                {
                    var parent = (child - 1) / 2;
                    if (_comparison(_heap[parent], _heap[child]) <= 0) break;
                    (_heap[parent], _heap[child]) = (_heap[child], _heap[parent]);
                    child = parent;
                }
            }
            public T Dequeue()
            {
                if (Count == 0) throw new InvalidOperationException();
                var result = _heap[0];
                _heap[0] = _heap[Count - 1];
                _heap.RemoveAt(Count - 1);
                var parent = 0;
                while (parent * 2 + 1 < Count)
                {
                    var left = parent * 2 + 1;
                    var right = parent * 2 + 2;
                    if (right < Count && _comparison(_heap[left], _heap[right]) > 0)
                        left = right;
                    if (_comparison(_heap[parent], _heap[left]) <= 0) break;
                    (_heap[parent], _heap[left]) = (_heap[left], _heap[parent]);
                    parent = left;
                }
                return result;
            }
            public T Peek()
            {
                if (Count == 0) throw new InvalidOperationException();
                return _heap[0];
            }
            public bool TryDequeue(out T result)
            {
                if (Count > 0)
                {
                    result = Dequeue();
                    return true;
                }
                result = default;
                return false;
            }
            public bool TryPeek(out T result)
            {
                if (Count > 0)
                {
                    result = Peek();
                    return true;
                }
                result = default;
                return false;
            }
            public void Clear() => _heap.Clear();
            public bool Contains(T item) => _heap.Contains(item);
        }

        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));
        }
    }
}

Submission Info

Submission Time
Task E - Skiing
User AconCavy
Language C# (.NET Core 3.1.201)
Score 500
Code Size 7359 Byte
Status AC
Exec Time 705 ms
Memory 100396 KiB

Judge Result

Set Name Sample All After_contest
Score / Max Score 0 / 0 500 / 500 0 / 0
Status
AC × 2
AC × 38
AC × 1
Set Name Test Cases
Sample example_00.txt, example_01.txt
All example_00.txt, example_01.txt, hand_00.txt, hand_01.txt, hand_02.txt, hand_03.txt, hand_04.txt, hand_05.txt, multi_00.txt, multi_01.txt, multi_02.txt, multi_03.txt, multi_04.txt, multi_05.txt, multi_06.txt, multi_07.txt, multi_08.txt, multi_09.txt, multi_10.txt, multi_11.txt, multi_12.txt, multi_13.txt, multi_14.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt
After_contest after_contest_01.txt
Case Name Status Exec Time Memory
after_contest_01.txt AC 85 ms 28824 KiB
example_00.txt AC 84 ms 27992 KiB
example_01.txt AC 91 ms 27992 KiB
hand_00.txt AC 87 ms 27888 KiB
hand_01.txt AC 76 ms 27920 KiB
hand_02.txt AC 448 ms 100396 KiB
hand_03.txt AC 432 ms 100144 KiB
hand_04.txt AC 440 ms 99992 KiB
hand_05.txt AC 452 ms 100104 KiB
multi_00.txt AC 347 ms 83852 KiB
multi_01.txt AC 432 ms 90460 KiB
multi_02.txt AC 359 ms 72636 KiB
multi_03.txt AC 362 ms 83232 KiB
multi_04.txt AC 345 ms 82968 KiB
multi_05.txt AC 470 ms 91796 KiB
multi_06.txt AC 311 ms 68288 KiB
multi_07.txt AC 381 ms 90312 KiB
multi_08.txt AC 427 ms 90360 KiB
multi_09.txt AC 298 ms 83208 KiB
multi_10.txt AC 391 ms 90972 KiB
multi_11.txt AC 300 ms 87228 KiB
multi_12.txt AC 434 ms 90644 KiB
multi_13.txt AC 456 ms 90848 KiB
multi_14.txt AC 396 ms 89960 KiB
random_00.txt AC 705 ms 99040 KiB
random_01.txt AC 670 ms 99092 KiB
random_02.txt AC 652 ms 99260 KiB
random_03.txt AC 187 ms 51616 KiB
random_04.txt AC 188 ms 51252 KiB
random_05.txt AC 187 ms 51532 KiB
random_06.txt AC 161 ms 50924 KiB
random_07.txt AC 149 ms 50336 KiB
random_08.txt AC 130 ms 45864 KiB
random_09.txt AC 209 ms 50172 KiB
random_10.txt AC 312 ms 58808 KiB
random_11.txt AC 174 ms 49544 KiB
random_12.txt AC 208 ms 51036 KiB
random_13.txt AC 182 ms 51356 KiB
random_14.txt AC 132 ms 43728 KiB