結果
問題 | No.2892 Lime and Karin |
ユーザー |
![]() |
提出日時 | 2024-09-13 22:46:44 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 287 ms / 8,000 ms |
コード長 | 2,254 bytes |
コンパイル時間 | 3,933 ms |
コンパイル使用メモリ | 255,636 KB |
最終ジャッジ日時 | 2025-02-24 08:04:42 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 52 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:111:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 111 | scanf("%d %d",&u,&v); | ~~~~~^~~~~~~~~~~~~~~
ソースコード
#include <stdio.h>#include <atcoder/all>#include <bits/stdc++.h>using namespace std;using namespace atcoder;using mint = modint998244353;#define rep(i,n) for (int i = 0; i < (n); ++i)#define Inf32 1000000001#define Inf64 4000000000000000001LLlong long ans = 0;int sz[200000];string S;void dfs(vector<vector<int>> &E,int cv,int pv){sz[cv] = 1;rep(i,E[cv].size()){int to = E[cv][i];if(to==pv)continue;dfs(E,to,cv);sz[cv] += sz[to];}}int find_centroid(vector<vector<int>> &E,int cv,int pv,int N){int ret = -1;int ma = 0;rep(i,E[cv].size()){int to = E[cv][i];if(to==pv)continue;ret = max(ret,find_centroid(E,to,cv,N));ma = max(ma,sz[to]);}ma = max(ma,N-sz[cv]);if(ma <= N/2)return cv;return ret;}int get(char c){if(c=='0')return -1;return 1;}void get(vector<vector<int>> &E,int cv,int pv,vector<int> &ret,int sum){sum += get(S[cv]);ret.push_back(sum);rep(i,E[cv].size()){int to = E[cv][i];if(to==pv)continue;get(E,to,cv,ret,sum);}}long long Get(vector<int> a,int x){if(a.size()==0)return 0;sort(a.begin(),a.end());int cp = a.size()-1;long long ret = 0;rep(i,a.size()){while(cp!=-1 && a[i]+x+a[cp]>0)cp--;ret += a.size()-1 - cp;if(a[i]+x+a[i]>0)ret++;}return ret;}void solve(vector<vector<int>> &E,int cv){dfs(E,cv,-1);int c = find_centroid(E,cv,-1,sz[cv]);//cout<<cv<<' '<<c<<endl;assert(c!=-1);rep(i,E[c].size()){int to = E[c][i];rep(j,E[to].size()){if(E[to][j]==c){E[to].erase(E[to].begin()+j);break;}}}vector<vector<int>> lists(E[c].size()+1);rep(i,E[c].size()){get(E,E[c][i],-1,lists[i],0);}lists.back() = {0};long long ts = 0;rep(i,lists.size()){ts -= Get(lists[i],get(S[c]));}vector<int> t;rep(i,lists.size()){rep(j,lists[i].size()){t.push_back(lists[i][j]);}}ts += Get(t,get(S[c]));//cout<<"t"<<ts<<endl;ts /= 2;ans += ts;if(get(S[c])>0)ans++;//cout<<'a'<<ans<<endl;rep(i,E[c].size()){int to = E[c][i];solve(E,to);}}int main(){int n;cin>>n;vector<vector<int>> E(n);rep(i,n-1){int u,v;scanf("%d %d",&u,&v);u--;v--;E[u].push_back(v);E[v].push_back(u);}cin>>S;solve(E,0);cout<<ans<<endl;return 0;}