結果
問題 | No.439 チワワのなる木 |
ユーザー |
![]() |
提出日時 | 2016-04-29 01:19:44 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 93 ms / 5,000 ms |
コード長 | 2,661 bytes |
コンパイル時間 | 1,607 ms |
コンパイル使用メモリ | 173,708 KB |
実行使用メモリ | 18,176 KB |
最終ジャッジ日時 | 2024-10-11 00:14:32 |
合計ジャッジ時間 | 3,133 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 28 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define int long long // <-----!!!!!!!!!!!!!!!!!!!#define rep(i,n) for (int i=0;i<(n);i++)#define rep2(i,a,b) for (int i=(a);i<(b);i++)#define rrep(i,n) for (int i=(n)-1;i>=0;i--)#define rrep2(i,a,b) for (int i=(b)-1;i>=(a);i--)#define all(a) (a).begin(),(a).end()typedef long long ll;typedef pair<int, int> P;// O(N)解// 2回DFSするstruct Chiwawa {int w, ww;Chiwawa() { w = 0, ww = 0; }};const int MAX_N = 100000;int N;string s;vector<vector<int>> G;Chiwawa cww[MAX_N]; // 各頂点を根とした部分木に含まれる(w, ww)の個数 (一番上の親は0)// 配列cwwを用意するためのdfsChiwawa dfs(int now, int pre) {Chiwawa ret;for (auto nxt : G[now]) {if (nxt == pre) continue;auto child = dfs(nxt, now);ret.w += child.w;ret.ww += child.ww;}if (s[now] == 'w') {// 自分がwなら、子のwの数だけwwが増えるret.ww += ret.w;// wは1増える++ret.w;}cww[now] = ret;return ret;}int ans; // 答えの記録用// 答えを求めるdfs// p: vの部分木に含まれない(w, ww)の個数void dfs2(int v, int pre, Chiwawa p) {// この頂点がcなら、つなげられるwwの個数を答えに加えるif (s[v] == 'c') {ans += p.ww; // pのwwとつなげたときfor (auto ch : G[v]) {if (ch == pre) continue;ans += cww[ch].ww; // chの部分木のwwとつなげたとき}}for (auto ch : G[v]) {if (ch == pre) continue;// 次の子に渡すためにpを更新するauto tmp = p;// vの部分木のうち、chの部分木の分を除くtmp.w += cww[v].w, tmp.ww += cww[v].ww;tmp.w -= cww[ch].w, tmp.ww -= cww[ch].ww;if (s[v] == 'w') {// vが 'w' の場合は、 vの 'w' を使っている分のwwの個数が変化する// v の 'w' と chの部分木の 'w' を使っている ww は減るtmp.ww -= cww[ch].w;// v の 'w' と p の 'w' を使っている ww が増えるtmp.ww += p.w;}// 子に移動dfs2(ch, v, tmp);}}signed main() {std::ios::sync_with_stdio(false);std::cin.tie(0);cin >> N;cin >> s;G.resize(N);rep(i, N - 1) {int a, b;cin >> a >> b;a--; b--;G[a].emplace_back(b);G[b].emplace_back(a);}// 準備dfs(0, -1);// 本番dfs2(0, -1, Chiwawa());cout << ans << endl;}