Advertisement
RaFiN_

tree dp with prefix and suffix dp

Aug 9th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.36 KB | None | 0 0
  1. /* codeforces 543D tree dp with prefix and suffix dp */
  2.  
  3. ll res[MAX];
  4. vi v[MAX];vl prefix[MAX],suffix[MAX];ll ans[MAX];
  5. void dfs(int s,int p){
  6.    
  7.     for(auto it : v[s]){
  8.         if(it==p)continue;
  9.         dfs(it,s);
  10.         res[s] = res[s] * (res[it] + 1);
  11.         if(res[s]>=mod)res[s]%=mod;
  12.     }
  13. }
  14.  
  15. void dfs2(int s,int p){
  16.     ans[s]= res[s];
  17.     ll pref = 1,suff = 1;
  18.     int len = v[s].size();
  19.     int cnt = 0;
  20.     for(auto it : v[s]){
  21.         prefix[s].pb(pref);
  22.         suffix[s].pb(suff);
  23.         pref = pref * (res[it] + 1);
  24.         pref%=mod;
  25.         suff = suff * (res[v[s][len - cnt - 1]] + 1);
  26.         suff%=mod;
  27.         cnt++;
  28.     }
  29.     reverse(all(suffix[s]));
  30.  
  31.     for(int i = 0;i<len;i++){
  32.         if(v[s][i]==p)continue;
  33.         ll temp = res[s];
  34.         res[s] = prefix[s][i] * suffix[s][i] ;
  35.         res[s]%=mod;
  36.         res[v[s][i]] = (res[s] + 1) * res[v[s][i]];
  37.         res[v[s][i]]%=mod;
  38.         dfs2(v[s][i],s);
  39.         res[s] = temp;
  40.     }
  41. }
  42.  
  43.  
  44. int main()
  45. {
  46.     booster()
  47.     ///read("input.txt");
  48.  
  49.     int n;
  50.     cin>>n;
  51.     for(int i = 1;i<n;i++){
  52.         int a;
  53.         cin>>a;
  54.         v[a].pb(i+1);
  55.         v[i+1].pb(a);
  56.     }
  57.  
  58.     for(int i = 1;i<=n;i++)res[i] = 1;
  59.  
  60.     dfs(1,0);
  61.  
  62.     dfs2(1,0);
  63.  
  64.     for(int i = 1;i<=n;i++)cout<<ans[i]<<" ";
  65.  
  66.  
  67.     return 0;
  68. }
  69.  
  70.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement