結果
問題 | No.1207 グラフX |
ユーザー | takytank |
提出日時 | 2020-08-30 13:35:21 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 780 ms / 2,000 ms |
コード長 | 13,220 bytes |
コンパイル時間 | 1,447 ms |
コンパイル使用メモリ | 123,076 KB |
実行使用メモリ | 94,184 KB |
最終ジャッジ日時 | 2024-11-15 06:51:37 |
合計ジャッジ時間 | 30,973 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 692 ms
56,424 KB |
testcase_01 | AC | 694 ms
56,424 KB |
testcase_02 | AC | 751 ms
56,932 KB |
testcase_03 | AC | 744 ms
56,560 KB |
testcase_04 | AC | 726 ms
56,296 KB |
testcase_05 | AC | 761 ms
93,808 KB |
testcase_06 | AC | 780 ms
93,932 KB |
testcase_07 | AC | 747 ms
94,184 KB |
testcase_08 | AC | 548 ms
43,896 KB |
testcase_09 | AC | 613 ms
49,124 KB |
testcase_10 | AC | 712 ms
75,620 KB |
testcase_11 | AC | 748 ms
93,932 KB |
testcase_12 | AC | 566 ms
45,040 KB |
testcase_13 | AC | 271 ms
28,800 KB |
testcase_14 | AC | 706 ms
54,888 KB |
testcase_15 | AC | 607 ms
47,360 KB |
testcase_16 | AC | 285 ms
30,464 KB |
testcase_17 | AC | 466 ms
42,232 KB |
testcase_18 | AC | 420 ms
42,028 KB |
testcase_19 | AC | 413 ms
34,932 KB |
testcase_20 | AC | 735 ms
56,168 KB |
testcase_21 | AC | 79 ms
24,064 KB |
testcase_22 | AC | 471 ms
42,608 KB |
testcase_23 | AC | 512 ms
45,424 KB |
testcase_24 | AC | 369 ms
41,728 KB |
testcase_25 | AC | 721 ms
56,052 KB |
testcase_26 | AC | 542 ms
46,588 KB |
testcase_27 | AC | 657 ms
51,936 KB |
testcase_28 | AC | 635 ms
49,508 KB |
testcase_29 | AC | 649 ms
51,956 KB |
testcase_30 | AC | 310 ms
34,428 KB |
testcase_31 | AC | 237 ms
27,008 KB |
testcase_32 | AC | 279 ms
35,068 KB |
testcase_33 | AC | 289 ms
35,060 KB |
testcase_34 | AC | 597 ms
47,092 KB |
testcase_35 | AC | 78 ms
24,064 KB |
testcase_36 | AC | 601 ms
49,012 KB |
testcase_37 | AC | 503 ms
43,900 KB |
testcase_38 | AC | 145 ms
28,288 KB |
testcase_39 | AC | 303 ms
36,860 KB |
testcase_40 | AC | 192 ms
24,448 KB |
testcase_41 | AC | 392 ms
35,712 KB |
testcase_42 | AC | 36 ms
19,200 KB |
testcase_43 | AC | 35 ms
19,328 KB |
testcase_44 | AC | 35 ms
19,200 KB |
testcase_45 | AC | 662 ms
56,676 KB |
testcase_46 | AC | 736 ms
56,676 KB |
testcase_47 | AC | 722 ms
56,684 KB |
testcase_48 | AC | 719 ms
56,560 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.Diagnostics; using System.IO; using System.Linq; using System.Numerics; using System.Reflection.Metadata; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Threading; namespace AtCoder { public class Program { static void Main() { var cin = new Scanner(); var (N, M, X) = cin.Int3(); var uf = new UnionFindTree(N); var to = Helper.Array(N, i => new List<(int v, int z)>()); var pows = new HashMap<int, ModInt>(i => 0, M); for (int i = 0; i < M; i++) { var x = cin.Int() - 1; var y = cin.Int() - 1; var z = cin.Int(); if (uf.IsUnited(x, y) == false) { uf.Unite(x, y); to[x].Add((y, z)); to[y].Add((x, z)); ModInt pow = ModInt.Pow(X, z); pows[z] = pow; } } (ModInt dist, int count) Dfs(int v, int prev) { ModInt dist = 0; int count = 1; foreach (var next in to[v]) { if (next.v == prev) { continue; } var ret = Dfs(next.v, v); dist += ret.dist; ModInt tempDist = pows[next.z] * ret.count * (N - ret.count); dist += tempDist; count += ret.count; } return (dist, count); } ModInt ans = Dfs(0, -1).dist; Console.WriteLine(ans); } } public class UnionFindTree { private readonly int[] sizes_; private readonly int[] parents_; public int Count { get; private set; } public int GroupCount { get; private set; } public UnionFindTree(int count) { parents_ = new int[count]; sizes_ = new int[count]; Count = 0; GroupCount = count; while (Count < count) { parents_[Count] = Count; sizes_[Count] = 1; ++Count; } } public int GetSizeOf(int x) => sizes_[Find(x)]; public bool IsUnited(int x, int y) => Find(x) == Find(y); public bool Unite(int x, int y) { x = Find(x); y = Find(y); if (y == x) { return false; } int parent = sizes_[x] < sizes_[y] ? y : x; int child = sizes_[x] < sizes_[y] ? x : y; --GroupCount; parents_[child] = parent; sizes_[parent] += sizes_[child]; return true; } public int Find(int x) { while (x != parents_[x]) { parents_[x] = parents_[parents_[x]]; x = parents_[x]; } return x; } public IEnumerable<int> GetAllRoots => parents_.Where(x => x == parents_[x]); } public class HashMap<TKey, TValue> : Dictionary<TKey, TValue> { private readonly Func<TKey, TValue> initialzier_; public HashMap(Func<TKey, TValue> initialzier) : base() { initialzier_ = initialzier; } public HashMap(Func<TKey, TValue> initialzier, int capacity) : base(capacity) { initialzier_ = initialzier; } new public TValue this[TKey key] { get { if (ContainsKey(key) == false) { base[key] = initialzier_(key); } return base[key]; } set { base[key] = value; } } } public struct ModInt { public const long P = 1000000007; //public const long P = 998244353; public static ModInt Inverse(ModInt value) => Pow(value, P - 2); public static ModInt Pow(ModInt value, long k) => Pow(value.value_, k); public static ModInt Pow(long value, long k) { long ret = 1; for (k %= P - 1; k > 0; k >>= 1, value = value * value % P) { if ((k & 1) == 1) { ret = ret * value % P; } } return new ModInt(ret); } private long value_; public ModInt(long value) => value_ = value; public ModInt(long value, bool mods) { if (mods) { value %= P; if (value < 0) { value += P; } } value_ = value; } public static ModInt operator +(ModInt lhs, ModInt rhs) { lhs.value_ = (lhs.value_ + rhs.value_) % P; return lhs; } public static ModInt operator +(long lhs, ModInt rhs) { rhs.value_ = (lhs + rhs.value_) % P; return rhs; } public static ModInt operator +(ModInt lhs, long rhs) { lhs.value_ = (lhs.value_ + rhs) % P; return lhs; } public static ModInt operator -(ModInt lhs, ModInt rhs) { lhs.value_ = (P + lhs.value_ - rhs.value_) % P; return lhs; } public static ModInt operator -(long lhs, ModInt rhs) { rhs.value_ = (P + lhs - rhs.value_) % P; return rhs; } public static ModInt operator -(ModInt lhs, long rhs) { lhs.value_ = (P + lhs.value_ - rhs) % P; return lhs; } public static ModInt operator *(ModInt lhs, ModInt rhs) { lhs.value_ = lhs.value_ * rhs.value_ % P; return lhs; } public static ModInt operator *(long lhs, ModInt rhs) { rhs.value_ = lhs * rhs.value_ % P; return rhs; } public static ModInt operator *(ModInt lhs, long rhs) { lhs.value_ = lhs.value_ * rhs % P; return lhs; } public static ModInt operator /(ModInt lhs, ModInt rhs) { long exp = P - 2; while (exp > 0) { if (exp % 2 > 0) { lhs *= rhs; } rhs *= rhs; exp /= 2; } return lhs; } public static implicit operator ModInt(long n) => new ModInt(n, true); public long ToLong() => value_; public override string ToString() => value_.ToString(); } public static class Helper { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void UpdateMin<T>(ref T target, T value) where T : IComparable<T> => target = target.CompareTo(value) > 0 ? value : target; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void UpdateMin<T>(ref T target, T value, Action<T> onUpdated) where T : IComparable<T> { if (target.CompareTo(value) > 0) { target = value; onUpdated(value); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void UpdateMax<T>(ref T target, T value) where T : IComparable<T> => target = target.CompareTo(value) < 0 ? value : target; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void UpdateMax<T>(ref T target, T value, Action<T> onUpdated) where T : IComparable<T> { if (target.CompareTo(value) < 0) { target = value; onUpdated(value); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[] Array<T>(int n, Func<int, T> init) => Enumerable.Range(0, n).Select(x => init(x)).ToArray(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<T> List<T>(int n, Func<int, T> init) => Enumerable.Range(0, n).Select(x => init(x)).ToList(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[,] Array2<T>(int n, int m, T init) where T : struct { var array = new T[n, m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { array[i, j] = init; } } return array; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[,] Array2<T>(int n, int m, Func<int, int, T> initializer) { var array = new T[n, m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { array[i, j] = initializer(i, j); } } return array; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[,,] Array3<T>(int n1, int n2, int n3, T init) where T : struct { var array = new T[n1, n2, n3]; for (int i1 = 0; i1 < n1; i1++) { for (int i2 = 0; i2 < n2; i2++) { for (int i3 = 0; i3 < n3; i3++) { array[i1, i2, i3] = init; } } } return array; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[,,,] Array4<T>(int n1, int n2, int n3, int n4, T init) where T : struct { var array = new T[n1, n2, n3, n4]; for (int i1 = 0; i1 < n1; i1++) { for (int i2 = 0; i2 < n2; i2++) { for (int i3 = 0; i3 < n3; i3++) { for (int i4 = 0; i4 < n4; i4++) { array[i1, i2, i3, i4] = init; } } } } return array; } private static readonly int[] delta4_ = { 1, 0, -1, 0, 1 }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void DoAt4(int i, int j, int imax, int jmax, Action<int, int> action) { for (int dn = 0; dn < 4; dn++) { int d4i = i + delta4_[dn]; int d4j = j + delta4_[dn + 1]; if ((uint)d4i < (uint)imax && (uint)d4j < (uint)jmax) { action(d4i, d4j); } } } private static readonly int[] delta8_ = { 1, 0, -1, 0, 1, 1, -1, -1, 1 }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void DoAt8(int i, int j, int imax, int jmax, Action<int, int> action) { for (int dn = 0; dn < 8; dn++) { int d8i = i + delta8_[dn]; int d8j = j + delta8_[dn + 1]; if ((uint)d8i < (uint)imax && (uint)d8j < (uint)jmax) { action(d8i, d8j); } } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void ForEachSubBit(int bit, Action<int> action) { for (int sub = bit; sub >= 0; sub--) { sub &= bit; action(sub); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string Reverse(string src) { var chars = src.ToCharArray(); for (int i = 0, j = chars.Length - 1; i < j; i++, j--) { var tmp = chars[i]; chars[i] = chars[j]; chars[j] = tmp; } return new string(chars); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string Join<T>(this IEnumerable<T> values, string separator = "") => string.Join(separator, values); } public class Scanner { private readonly char[] delimiter_ = new char[] { ' ' }; private readonly string filePath_; private readonly Func<string> reader_; private string[] buf_; private int index_; public Scanner(string file = "") { if (string.IsNullOrWhiteSpace(file)) { reader_ = Console.ReadLine; } else { filePath_ = file; var fs = new StreamReader(file); reader_ = fs.ReadLine; } buf_ = new string[0]; index_ = 0; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public string NextLine() => reader_(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public string Next() { if (index_ < buf_.Length) { return buf_[index_++]; } string st = reader_(); while (st == "") { st = reader_(); } buf_ = st.Split(delimiter_, StringSplitOptions.RemoveEmptyEntries); if (buf_.Length == 0) { return Next(); } index_ = 0; return buf_[index_++]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Int() => int.Parse(Next()); [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Int(int offset) => int.Parse(Next()) + offset; [MethodImpl(MethodImplOptions.AggressiveInlining)] public (int, int) Int2(int offset = 0) => (Int(offset), Int(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public (int, int, int) Int3(int offset = 0) => (Int(offset), Int(offset), Int(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public (int, int, int, int) Int4(int offset = 0) => (Int(offset), Int(offset), Int(offset), Int(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public int[] ArrayInt(int length, int offset = 0) { int[] Array = new int[length]; for (int i = 0; i < length; i++) { Array[i] = Int(offset); } return Array; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public long Long() => long.Parse(Next()); [MethodImpl(MethodImplOptions.AggressiveInlining)] public long Long(long offset) => long.Parse(Next()) + offset; [MethodImpl(MethodImplOptions.AggressiveInlining)] public (long, long) Long2(long offset = 0) => (Long(offset), Long(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public (long, long, long) Long3(long offset = 0) => (Long(offset), Long(offset), Long(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public (long, long, long, long) Long4(long offset = 0) => (Long(offset), Long(offset), Long(offset), Long(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public long[] ArrayLong(int length, long offset = 0) { long[] Array = new long[length]; for (int i = 0; i < length; i++) { Array[i] = Long(offset); } return Array; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public double Double() => double.Parse(Next()); [MethodImpl(MethodImplOptions.AggressiveInlining)] public double Double(double offset) => double.Parse(Next()) + offset; [MethodImpl(MethodImplOptions.AggressiveInlining)] public (double, double) Double2(double offset = 0) => (Double(offset), Double(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public (double, double, double) Double3(double offset = 0) => (Double(offset), Double(offset), Double(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public (double, double, double, double) Double4(double offset = 0) => (Double(offset), Double(offset), Double(offset), Double(offset)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public double[] ArrayDouble(int length, double offset = 0) { double[] Array = new double[length]; for (int i = 0; i < length; i++) { Array[i] = Double(offset); } return Array; } public void Save(string text) { if (string.IsNullOrWhiteSpace(filePath_)) { return; } File.WriteAllText(filePath_ + "_output.txt", text); } } }