結果
| 問題 |
No.439 チワワのなる木
|
| ユーザー |
iicafiaxus
|
| 提出日時 | 2016-10-28 23:28:50 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,940 bytes |
| コンパイル時間 | 1,596 ms |
| コンパイル使用メモリ | 170,548 KB |
| 実行使用メモリ | 79,028 KB |
| 最終ジャッジ日時 | 2024-06-12 04:47:29 |
| 合計ジャッジ時間 | 11,478 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 25 TLE * 1 -- * 2 |
コンパイルメッセージ
Main.d(85): Deprecation: foreach: loop index implicitly converted from `size_t` to `int`
ソースコード
import std.stdio;
import std.conv, std.array, std.algorithm, std.string;
import std.math, std.random, std.range, std.datetime;
import std.bigint;
ulong globalw;
class Node{
int id;
char name;
Node[] adjnodes;
this(int id, char c){
this.id = id;
this.name = c;
}
private ulong _value;
private bool _hasValue = false;
ulong value(){
if(!_hasValue) calcValue;
return _value;
}
void calcValue(){
debug static int x;
debug x += 1;
debug if(x % 100 == 0) writeln("calcValue ", x);
ulong v;
if(this.name == 'w'){
foreach(nx; adjnodes){
v += nx.ccount(this) * (globalw - 1 - nx.wcount(this));
}
}
else v = 0;
_value = v;
_hasValue = true;
}
private ulong[int] _ccount;
ulong ccount(Node nd){
if(!(nd.id in _ccount)){
debug static int x;
debug x += 1;
debug if(x % 100 == 0) writeln("ccount ", x);
ulong c;
c = 0;
if(this.name == 'c') c += 1;
foreach(nx; adjnodes){
if(nx.id != nd.id) c += nx.ccount(this);
}
_ccount[nd.id] = c;
}
return _ccount[nd.id];
}
private ulong[int] _wcount;
ulong wcount(Node nd){
if(!(nd.id in _wcount)){
debug static int x;
debug x += 1;
debug if(x % 100 == 0) writeln("wcount ", x);
ulong c;
if(this.name == 'w') c += 1;
foreach(nx; adjnodes){
if(nx.id != nd.id) c += nx.wcount(this);
}
_wcount[nd.id] = c;
}
return _wcount[nd.id];
}
}
class Edge{
this(Node nd1, Node nd2){
nd1.adjnodes ~= nd2;
nd2.adjnodes ~= nd1;
}
}
void main(){
int n = readln.chomp.to!int;
string s = readln.chomp;
Node[] nodes;
foreach(int i, c; s){
nodes ~= new Node(i, c);
}
Edge[] edges;
for(int i = 1; i <= n - 1; i ++){
int[] tmp = readln.chomp.split.map!(to!int).map!(x => x - 1).array;
edges ~= new Edge(nodes[tmp[0]] , nodes[tmp[1]]);
}
foreach(nd; nodes) if(nd.name == 'w') globalw += 1;
BigInt ans;
foreach(nd; nodes) ans += nd.value;
ans.writeln;
}
iicafiaxus