Submission #38052012


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 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 = Scanner.Scan<int>();
            var dict = new Dictionary<string, int>();
            var query = new (string S, string T)[N];
            var G = new Graph(N * 2);
            var idx = 0;
            for (var i = 0; i < N; i++)
            {
                var (s, t) = Scanner.Scan<string, string>();
                if (!dict.ContainsKey(s)) dict[s] = idx++;
                if (!dict.ContainsKey(t)) dict[t] = idx++;
                query[i] = (s, t);
                var (u, v) = (dict[s], dict[t]);
                G.AddEdge(u, v, 1);
            }

            var (answer, _) = G.TopologicalSort();
            Console.WriteLine(answer ? "Yes" : "No");
        }

        public class Graph
        {
            public int Length { get; }
            private readonly List<Edge>[] _data;
            private readonly int[] _degree;
            public Graph(int length)
            {
                if (length < 0) throw new ArgumentOutOfRangeException(nameof(length));
                Length = length;
                _data = new List<Edge>[Length].Select(_ => new List<Edge>()).ToArray();
                _degree = new int[Length];
            }
            public void AddEdge(int u, int v, long cost)
            {
                if (u < 0 || Length <= u) throw new ArgumentOutOfRangeException(nameof(u));
                if (v < 0 || Length <= v) throw new ArgumentOutOfRangeException(nameof(v));
                _data[u].Add(new Edge(v, cost));
                _degree[v]++;
            }

            public (bool, int[]) TopologicalSort()
            {
                var queue = new Queue<int>();
                var degree = new int[Length];
                _degree.CopyTo(degree, 0);
                for (var i = 0; i < degree.Length; i++)
                {
                    if (degree[i] == 0) queue.Enqueue(i);
                }
                var result = new int[Length];
                var idx = 0;
                while (queue.Count > 0)
                {
                    var v = queue.Dequeue();
                    foreach (var node in _data[v])
                    {
                        degree[node.To]--;
                        if (degree[node.To] == 0) queue.Enqueue(node.To);
                    }
                    result[idx++] = v;
                }
                return (idx == Length, result);
            }
            private readonly struct Edge
            {
                internal int To { get; }
                internal long Cost { get; }
                public Edge(int to, long cost) => (To, Cost) = (to, cost);
            }
        }

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

Submission Info

Submission Time
Task D - Change Usernames
User AconCavy
Language C# (.NET Core 3.1.201)
Score 400
Code Size 5585 Byte
Status AC
Exec Time 340 ms
Memory 74676 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 3
AC × 22
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All 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, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, sample_01.txt, sample_02.txt, sample_03.txt
Case Name Status Exec Time Memory
random_01.txt AC 287 ms 74676 KiB
random_02.txt AC 278 ms 74432 KiB
random_03.txt AC 310 ms 72988 KiB
random_04.txt AC 303 ms 71844 KiB
random_05.txt AC 278 ms 73564 KiB
random_06.txt AC 308 ms 71628 KiB
random_07.txt AC 318 ms 73352 KiB
random_08.txt AC 321 ms 71628 KiB
random_09.txt AC 340 ms 71804 KiB
random_10.txt AC 338 ms 72176 KiB
random_11.txt AC 330 ms 72624 KiB
random_12.txt AC 327 ms 72752 KiB
random_13.txt AC 334 ms 73408 KiB
random_14.txt AC 324 ms 72008 KiB
random_15.txt AC 326 ms 72280 KiB
random_16.txt AC 329 ms 72232 KiB
random_17.txt AC 318 ms 72528 KiB
random_18.txt AC 322 ms 73100 KiB
random_19.txt AC 85 ms 28276 KiB
sample_01.txt AC 84 ms 28380 KiB
sample_02.txt AC 86 ms 28152 KiB
sample_03.txt AC 90 ms 28196 KiB