結果
| 問題 |
No.19 ステージの選択
|
| ユーザー |
eitaho
|
| 提出日時 | 2015-02-14 19:52:35 |
| 言語 | C#(csc) (csc 3.9.0) |
| 結果 |
AC
|
| 実行時間 | 37 ms / 5,000 ms |
| コード長 | 4,426 bytes |
| コンパイル時間 | 1,257 ms |
| コンパイル使用メモリ | 111,872 KB |
| 実行使用メモリ | 19,840 KB |
| 最終ジャッジ日時 | 2024-12-23 10:01:25 |
| 合計ジャッジ時間 | 3,160 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Enu = System.Linq.Enumerable;
class Program
{
static readonly int INF = (int)1e6;
void Solve()
{
int N = reader.Int();
int[] L = new int[N], S = new int[N];
var scc = new SCC(N);
for (int i = 0; i < N; i++)
{
L[i] = reader.Int() * 2;
S[i] = reader.Int() - 1;
scc.AddEdge(S[i], i);
}
scc.Decompose();
int ans = 0;
bool[] seen = new bool[N];
for (int c = 0; c < scc.NumComponents; c++)
{
var vs = scc.Vertexes(c);
int sum = vs.Sum(v => L[v]);
if (vs.Any(v => seen[S[v]])) ans += sum / 2;
else
{
int min = vs.Min(v => L[v]);
ans += (sum - min) / 2 + min;
}
Array.ForEach(vs, v => seen[v] = true);
}
Console.WriteLine((ans / 2.0).ToString("f1"));
}
class SCC
{
public int NumComponents { get; private set; }
public int[] Vertexes(int at) { return vertexes[at].ToArray(); }
public int Component(int v) { return component[v]; }
private readonly bool[] seen;
private readonly int[] component;
private readonly List<int> vs = new List<int>();
private readonly List<int>[] E, RevE;
private readonly List<List<int>> vertexes = new List<List<int>>();
public SCC(int N)
{
vs = new List<int>();
seen = new bool[N];
component = new int[N];
E = new List<int>[N];
RevE = new List<int>[N];
for (int i = 0; i < N; i++)
{
component[i] = -1;
E[i] = new List<int>();
RevE[i] = new List<int>();
}
}
public void AddEdge(int from, int to)
{
E[from].Add(to);
RevE[to].Add(from);
}
public void Decompose()
{
for (int v = 0; v < E.Length; v++)
if (!seen[v]) DFS(v);
vs.Reverse();
foreach (int v in vs)
if (component[v] == -1)
{
vertexes.Add(new List<int>());
DFSRev(v, NumComponents++);
}
}
private void DFS(int v)
{
seen[v] = true;
foreach (int next in E[v])
if (!seen[next]) DFS(next);
vs.Add(v);
}
private void DFSRev(int v, int num)
{
component[v] = num;
vertexes[num].Add(v);
foreach (int next in RevE[v])
if (component[next] == -1) DFSRev(next, num);
}
}
Reader reader = new Reader(Console.In);
static void Main() { new Program().Solve(); }
}
class Reader
{
private readonly TextReader reader;
private readonly char[] separator = { ' ' };
private readonly StringSplitOptions removeOp = StringSplitOptions.RemoveEmptyEntries;
private string[] A = new string[0];
private int i;
public Reader(TextReader r) { reader = r; }
public bool HasNext() { return Enqueue(); }
public string String() { return Dequeue(); }
public int Int() { return int.Parse(Dequeue()); }
public long Long() { return long.Parse(Dequeue()); }
public double Double() { return double.Parse(Dequeue()); }
public int[] IntLine() { var s = Line(); return s == "" ? new int[0] : Array.ConvertAll(Split(s), int.Parse); }
public int[] IntArray(int N) { return Enu.Range(0, N).Select(i => Int()).ToArray(); }
public int[][] IntGrid(int H) { return Enu.Range(0, H).Select(i => IntLine()).ToArray(); }
public string[] StringArray(int N) { return Enu.Range(0, N).Select(i => Line()).ToArray(); }
public string Line() { return reader.ReadLine().Trim(); }
private string[] Split(string s) { return s.Split(separator, removeOp); }
private bool Enqueue()
{
if (i < A.Length) return true;
string line = reader.ReadLine();
if (line == null) return false;
if (line == "") return Enqueue();
A = Split(line);
i = 0;
return true;
}
private string Dequeue() { Enqueue(); return A[i++]; }
}
eitaho