Sum in the tree
生活随笔
收集整理的這篇文章主要介紹了
Sum in the tree
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
https://codeforces.com/contest/1099/problem/D
題解:對于每個-1,如果有子節(jié)點則最大化,無子節(jié)點則最小化。
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int using namespace std; typedef long long ll; //typedef __int128 lll; const int N=200000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,q; ll ans; ll a[N]; vector<int>G[N]; char str; void dfs(int rt,int m){if(a[rt]==-1){ll tmp = INF;for(int v:G[rt])tmp = min(tmp,a[v]); if(tmp==INF) tmp=m;a[rt]=tmp;}if(a[rt]-m<0){cout<<-1<<endl;//printf("%d",rt);exit(0);}ans += a[rt]-m;for(int v:G[rt])dfs(v,a[rt]); } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endifscanf("%d",&n);for(int i=2;i<=n;i++){scanf("%d",&t);G[t].push_back(i);//for(int v:G[t])cout<<v<<t;}for(int i=1;i<=n;i++){scanf("%I64d",&a[i]);}ans=0;dfs(1,0);cout<<ans<<endl;//cout << "Hello world!" << endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的Sum in the tree的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Easy problem
- 下一篇: 矩阵快速幂(Matrix_Fast_Po