Submission #1307994
Source Code Expand
using System; using System.Linq; using System.Collections.Generic; using Debug = System.Diagnostics.Debug; using SB = System.Text.StringBuilder; using Number = System.Int64; //using System.Numerics; using static System.Math; //using static MathEx; using P = System.Collections.Generic.KeyValuePair<int, int>; namespace Program { public class Solver { public void Solve() { var n = ri; var G = Enumerate(n, x => new List<int>()); for (int i = 0; i < n - 1; i++) { var f = ri - 1; var t = ri - 1; G[f].Add(t); G[t].Add(f); } var s = rs; long ans = f(n, G, s); Debug.WriteLine("go"); for (int i = 0; i < n; i++) { ans += Max(0, dp[i].secd - dp[i].minx + 1); //Debug.WriteLine("{0} {1} {2}", i, dp[i].minx, dp[i].secd); } IO.Printer.Out.WriteLine(ans); } DP[] dp; int f(int n, List<int>[] G, string s) { dp = new DP[n]; DP.New = () => { var ret = new DP(); ret.maxd = ret.secd = -100000; ret.minx = 1000000000; return ret; }; DP.Merge = (l, r, rst) => { var ret = new DP(); ret.maxd = l.maxd; ret.secd = l.secd; ret.minx = l.minx; if (ret.maxd < r.maxd) { ret.secd = ret.maxd; ret.maxd = r.maxd; } else if (ret.secd < r.maxd) ret.secd = r.maxd; if (r.maxd >= 0 && r.minx < 1000000000) ret.minx = Min(l.minx, r.maxd); return ret; }; DP.Root = val => { var ret = new DP(); ret.maxd = Max(0, val.maxd + 1); ret.secd = Max(0, val.secd + 1); ret.minx = val.minx + 1; return ret; }; Func<int, int, DP> dfs = null; dfs = (prev, cur) => { var ret = DP.New(); foreach (var to in G[cur]) if (prev != to) ret += dfs(cur, to); dp[cur] = !ret; if (s[cur] == '1') dp[cur].minx = 0; return dp[cur]; }; dfs(-1, 0); var ans = 0; var rdp = Enumerate(n, x => new DP[G[x].Count + 1]); dfs = (prev, cur) => { var ret = DP.New(); var k = G[cur].Count; rdp[cur][k] = DP.New(); for (int i = k - 1; i >= 0; i--) rdp[cur][i] = rdp[cur][i + 1] + dp[G[cur][i]]; for (int i = 0; i < k; i++) { var to = G[cur][i]; var pre = dp[to]; dp[cur] = !(ret * rdp[cur][i + 1]); if (s[cur] == '1') dp[cur].minx = 0; ret += dp[to]; if (prev != to) { var min = Min(dp[cur].maxd, dp[to].maxd); var ok = false; if (dp[cur].maxd == min && dp[cur].minx < min + 1) ok = true; if (dp[to].maxd == min && dp[to].minx < min + 1) ok = true; if (ok) { //Debug.WriteLine("{0} {1}", cur, to); ans++; } dfs(cur, to); } } dp[cur] = !ret; if (s[cur] == '1') dp[cur].minx = 0; return dp[cur]; }; dfs(-1, 0); return ans; } //* int ri => sc.Integer(); long rl => sc.Long(); double rd => sc.Double(); string rs => sc.Scan(); char rc => sc.Char(); [System.Diagnostics.Conditional("DEBUG")] void put(params object[] a) => Debug.WriteLine(string.Join(" ", a)); //*/ public IO.StreamScanner sc = new IO.StreamScanner(Console.OpenStandardInput()); static T[] Enumerate<T>(int n, Func<int, T> f) { var a = new T[n]; for (int i = 0; i < n; ++i) a[i] = f(i); return a; } static public void Swap<T>(ref T a, ref T b) { var tmp = a; a = b; b = tmp; } } } #region main static class Ex { static public string AsString(this IEnumerable<char> ie) { return new string(System.Linq.Enumerable.ToArray(ie)); } static public string AsJoinedString<T>(this IEnumerable<T> ie, string st = " ") { return string.Join(st, ie); } static public void Main() { var solver = new Program.Solver(); solver.Solve(); Program.IO.Printer.Out.Flush(); } } #endregion #region Ex namespace Program.IO { using System.IO; using System.Text; using System.Globalization; public class Printer: StreamWriter { static Printer() { Out = new Printer(Console.OpenStandardOutput()) { AutoFlush = false }; } public static Printer Out { get; set; } public override IFormatProvider FormatProvider { get { return CultureInfo.InvariantCulture; } } public Printer(System.IO.Stream stream) : base(stream, new UTF8Encoding(false, true)) { } public Printer(System.IO.Stream stream, Encoding encoding) : base(stream, encoding) { } public void Write<T>(string format, T[] source) { base.Write(format, source.OfType<object>().ToArray()); } public void WriteLine<T>(string format, T[] source) { base.WriteLine(format, source.OfType<object>().ToArray()); } } public class StreamScanner { public StreamScanner(Stream stream) { str = stream; } public readonly Stream str; private readonly byte[] buf = new byte[1024]; private int len, ptr; public bool isEof = false; public bool IsEndOfStream { get { return isEof; } } private byte read() { if (isEof) return 0; if (ptr >= len) { ptr = 0; if ((len = str.Read(buf, 0, 1024)) <= 0) { isEof = true; return 0; } } return buf[ptr++]; } public char Char() { byte b = 0; do b = read(); while ((b < 33 || 126 < b) && !isEof); return (char)b; } public string Scan() { var sb = new StringBuilder(); for (var b = Char(); b >= 33 && b <= 126; b = (char)read()) sb.Append(b); return sb.ToString(); } public string ScanLine() { var sb = new StringBuilder(); for (var b = Char(); b != '\n'; b = (char)read()) if (b == 0) break; else if (b != '\r') sb.Append(b); return sb.ToString(); } public long Long() { if (isEof) return long.MinValue; long ret = 0; byte b = 0; var ng = false; do b = read(); while (b != 0 && b != '-' && (b < '0' || '9' < b)); if (b == 0) return long.MinValue; if (b == '-') { ng = true; b = read(); } for (; true; b = read()) { if (b < '0' || '9' < b) return ng ? -ret : ret; else ret = ret * 10 + b - '0'; } } public int Integer() { return (isEof) ? int.MinValue : (int)Long(); } public double Double() { var s = Scan(); return s != "" ? double.Parse(s, CultureInfo.InvariantCulture) : double.NaN; } private T[] enumerate<T>(int n, Func<T> f) { var a = new T[n]; for (int i = 0; i < n; ++i) a[i] = f(); return a; } public char[] Char(int n) { return enumerate(n, Char); } public string[] Scan(int n) { return enumerate(n, Scan); } public double[] Double(int n) { return enumerate(n, Double); } public int[] Integer(int n) { return enumerate(n, Integer); } public long[] Long(int n) { return enumerate(n, Long); } } } #endregion public struct DP { public int maxd; public int secd; public int minx; //単位元を入れる public static Func<DP> New; /// <summary> /// 2つの森をマージする.trueのとき,右は木 /// </summary> public static Func<DP, DP, bool, DP> Merge; /// <summary> /// 根をつける /// </summary> public static Func<DP, DP> Root; public static DP operator +(DP l, DP r) { return Merge(l, r, true); } public static DP operator *(DP l, DP r) { return Merge(l, r, false); } public static DP operator !(DP x) { return Root(x); } }
Submission Info
Submission Time | |
---|---|
Task | F - Black Radius |
User | camypaper |
Language | C# (Mono 4.6.2.0) |
Score | 1900 |
Code Size | 9070 Byte |
Status | AC |
Exec Time | 450 ms |
Memory | 128872 KB |
Judge Result
Set Name | Sample | Subtask | All | ||||||
---|---|---|---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 1300 / 1300 | 600 / 600 | ||||||
Status |
|
|
|
Set Name | Test Cases |
---|---|
Sample | 0_00.txt, 0_01.txt, 0_02.txt |
Subtask | 0_01.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt |
All | 0_00.txt, 0_01.txt, 0_02.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt, 2_00.txt, 2_01.txt, 2_02.txt, 2_03.txt, 2_04.txt, 2_05.txt, 2_06.txt, 2_07.txt, 2_08.txt, 2_09.txt, 2_10.txt, 2_11.txt, 2_12.txt, 2_13.txt, 2_14.txt, 2_15.txt, 2_16.txt, 2_17.txt, 2_18.txt, 2_19.txt, 2_20.txt, 2_21.txt, 2_22.txt, 2_23.txt, 2_24.txt, 2_25.txt, 2_26.txt, 2_27.txt, 2_28.txt, 2_29.txt, 2_30.txt, 2_31.txt, 2_32.txt, 2_33.txt, 2_34.txt, 2_35.txt, 2_36.txt, 2_37.txt, 2_38.txt, 2_39.txt, 2_40.txt, 2_41.txt, 2_42.txt, 2_43.txt, 2_44.txt, 2_45.txt, 2_46.txt, 2_47.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
0_00.txt | AC | 25 ms | 11348 KB |
0_01.txt | AC | 25 ms | 11476 KB |
0_02.txt | AC | 25 ms | 11476 KB |
1_00.txt | AC | 25 ms | 9300 KB |
1_01.txt | AC | 450 ms | 128872 KB |
1_02.txt | AC | 426 ms | 100584 KB |
1_03.txt | AC | 347 ms | 55528 KB |
1_04.txt | AC | 318 ms | 54096 KB |
1_05.txt | AC | 306 ms | 49612 KB |
1_06.txt | AC | 338 ms | 57064 KB |
1_07.txt | AC | 332 ms | 53224 KB |
1_08.txt | AC | 344 ms | 59112 KB |
1_09.txt | AC | 396 ms | 89192 KB |
1_10.txt | AC | 401 ms | 82400 KB |
1_11.txt | AC | 426 ms | 126036 KB |
1_12.txt | AC | 348 ms | 69716 KB |
1_13.txt | AC | 391 ms | 84600 KB |
1_14.txt | AC | 354 ms | 69560 KB |
1_15.txt | AC | 346 ms | 62856 KB |
1_16.txt | AC | 374 ms | 75160 KB |
1_17.txt | AC | 407 ms | 79856 KB |
1_18.txt | AC | 343 ms | 52916 KB |
1_19.txt | AC | 328 ms | 50868 KB |
1_20.txt | AC | 343 ms | 53588 KB |
1_21.txt | AC | 357 ms | 57964 KB |
1_22.txt | AC | 320 ms | 51728 KB |
1_23.txt | AC | 342 ms | 55704 KB |
1_24.txt | AC | 339 ms | 60200 KB |
1_25.txt | AC | 356 ms | 67728 KB |
1_26.txt | AC | 328 ms | 50980 KB |
1_27.txt | AC | 318 ms | 53892 KB |
1_28.txt | AC | 318 ms | 56072 KB |
1_29.txt | AC | 366 ms | 74120 KB |
2_00.txt | AC | 25 ms | 9428 KB |
2_01.txt | AC | 442 ms | 125800 KB |
2_02.txt | AC | 440 ms | 116456 KB |
2_03.txt | AC | 441 ms | 106728 KB |
2_04.txt | AC | 420 ms | 86632 KB |
2_05.txt | AC | 430 ms | 89832 KB |
2_06.txt | AC | 443 ms | 95208 KB |
2_07.txt | AC | 347 ms | 53352 KB |
2_08.txt | AC | 360 ms | 51304 KB |
2_09.txt | AC | 401 ms | 53352 KB |
2_10.txt | AC | 386 ms | 54096 KB |
2_11.txt | AC | 336 ms | 54096 KB |
2_12.txt | AC | 317 ms | 52176 KB |
2_13.txt | AC | 298 ms | 53708 KB |
2_14.txt | AC | 299 ms | 51788 KB |
2_15.txt | AC | 304 ms | 47692 KB |
2_16.txt | AC | 327 ms | 50920 KB |
2_17.txt | AC | 355 ms | 57064 KB |
2_18.txt | AC | 335 ms | 55016 KB |
2_19.txt | AC | 335 ms | 57320 KB |
2_20.txt | AC | 338 ms | 53224 KB |
2_21.txt | AC | 341 ms | 55144 KB |
2_22.txt | AC | 342 ms | 58344 KB |
2_23.txt | AC | 349 ms | 59880 KB |
2_24.txt | AC | 351 ms | 58728 KB |
2_25.txt | AC | 400 ms | 91752 KB |
2_26.txt | AC | 395 ms | 84456 KB |
2_27.txt | AC | 399 ms | 93544 KB |
2_28.txt | AC | 372 ms | 81304 KB |
2_29.txt | AC | 433 ms | 116996 KB |
2_30.txt | AC | 401 ms | 106264 KB |
2_31.txt | AC | 405 ms | 84224 KB |
2_32.txt | AC | 332 ms | 57324 KB |
2_33.txt | AC | 352 ms | 68236 KB |
2_34.txt | AC | 373 ms | 79712 KB |
2_35.txt | AC | 412 ms | 95352 KB |
2_36.txt | AC | 336 ms | 57012 KB |
2_37.txt | AC | 338 ms | 53024 KB |
2_38.txt | AC | 346 ms | 63800 KB |
2_39.txt | AC | 351 ms | 54280 KB |
2_40.txt | AC | 315 ms | 51716 KB |
2_41.txt | AC | 338 ms | 60184 KB |
2_42.txt | AC | 310 ms | 55756 KB |
2_43.txt | AC | 382 ms | 85744 KB |
2_44.txt | AC | 306 ms | 49460 KB |
2_45.txt | AC | 313 ms | 55280 KB |
2_46.txt | AC | 319 ms | 54648 KB |
2_47.txt | AC | 367 ms | 72220 KB |