Guest User

Untitled

a guest
Dec 12th, 2021
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define ld double
  6. #define mod 1000000007
  7.  
  8. int col[100010], cnt[100010];
  9. ll seq[100010];
  10. int res[100010];
  11. ll h[100010], h2[100010];
  12. vector <int> g[100010];
  13. int sz[100010];
  14. ll val=0, val2=0;
  15. bool big[100010];
  16.  
  17. void calcSz(int src, int par)
  18. {
  19.     sz[src]=1;
  20.  
  21.     for(auto x: g[src])
  22.     {
  23.         if(x==par)
  24.             continue;
  25.         calcSz(x, src);
  26.         sz[src]+=sz[x];
  27.     }
  28.     return;
  29. }
  30.  
  31. void add(int src, int par, int x)
  32. {
  33.     cnt[col[src]]+=x;
  34.     // if(x==1) cout<<src<<endl;
  35.     if(x==1 && cnt[col[src]]==1)
  36.         val+=h[col[src]], val%=mod, val2+=h2[col[src]], val2%=mod;
  37.     if(x==-1 && cnt[col[src]]==0)
  38.         val+=mod-h[col[src]], val%=mod, val2+=mod-h2[col[src]], val2%=mod;
  39.  
  40.     for(auto y: g[src])
  41.     {
  42.         if(y==par || big[y])
  43.             continue;
  44.         add(y, src, x);
  45.     }
  46. }
  47.  
  48. void dfs(int v, int p, bool keep)
  49. {
  50.     int mx = -1, bigChild = -1;
  51.     for(auto u : g[v])
  52.         if(u != p && sz[u] > mx)
  53.             mx = sz[u], bigChild = u;
  54.     for(auto u : g[v])
  55.         if(u != p && u != bigChild)
  56.             dfs(u, v, 0);
  57.     if(bigChild != -1)
  58.         dfs(bigChild, v, 1), big[bigChild] = 1;
  59.  
  60.     add(v, p, 1);
  61.     // if(v==4) cout<<cnt[3]<<endl;
  62.     seq[v]=val|(val2<<31);
  63.     if(bigChild != -1)
  64.         big[bigChild] = 0;
  65.     if(keep == 0)
  66.         add(v, p, -1);
  67. }
  68.  
  69.  
  70. void add2(int src, int par, int x)
  71. {
  72.     cnt[col[src]]+=x;
  73.     if(x==1 && cnt[col[src]]==1)
  74.         val+=1;
  75.     if(x==-1 && cnt[col[src]]==0)
  76.         val-=1;
  77.  
  78.     for(auto y: g[src])
  79.     {
  80.         if(y==par || big[y])
  81.             continue;
  82.         add2(y, src, x);
  83.     }
  84. }
  85.  
  86. void dfs2(int v, int p, bool keep)
  87. {
  88.     int mx = -1, bigChild = -1;
  89.     for(auto u : g[v])
  90.         if(u != p && sz[u] > mx)
  91.             mx = sz[u], bigChild = u;
  92.     for(auto u : g[v])
  93.         if(u != p && u != bigChild)
  94.             dfs2(u, v, 0);
  95.     if(bigChild != -1)
  96.         dfs2(bigChild, v, 1), big[bigChild] = 1;
  97.     add2(v, p, 1);
  98.     res[v]=val;
  99.     if(bigChild != -1)
  100.         big[bigChild] = 0;
  101.     if(keep == 0)
  102.         add2(v, p, -1);
  103. }
  104.  
  105. map<ll, int> mp1;
  106.  
  107. ll fastPow(ll x, ll y)
  108. {
  109.     if(y==0)
  110.         return 1;
  111.  
  112.     ll ret=fastPow(x, y/2);
  113.  
  114.     ret=ret*ret;
  115.     ret%=mod;
  116.     if(y%2==1)
  117.         ret*=x, ret%=mod;
  118.     return ret;
  119. }
  120.  
  121. int main()
  122. {
  123.     int i, j, n, m, t;
  124.  
  125.  
  126.     for(i=1; i<=100001; i++)
  127.     {
  128.         h[i]=fastPow(i, 10000000799LL);
  129.         h2[i]=fastPow(i, 9772133383LL);
  130.         // if(mp1[h[i]]) cout<<i<<endl;
  131.         // mp1[h[i]]=1;
  132.     }
  133.  
  134.     scanf("%d", &t);
  135.  
  136.     while(t--)
  137.     {
  138.         scanf("%d", &n);
  139.         int id=2;
  140.         mp1.clear();
  141.         for(i=0; i<=n; i++)
  142.         {
  143.             g[i].clear();
  144.             sz[i]=0;
  145.         }
  146.         // cout<<"*";
  147.         for(i=1; i<=n; i++)
  148.         {
  149.             int x;
  150.             scanf("%d", &x);
  151.             if(mp1[x] == 0)
  152.                 mp1[x]=id++;
  153.             col[i]=mp1[x];
  154.             // cout<<col[i]<<" ";
  155.         }
  156.         // cout<<endl;
  157.         int root=0;
  158.         for(i=1; i<=n; i++)
  159.         {
  160.             int u;
  161.             scanf("%d", &u);
  162.             if(u==-1)
  163.                 root=i;
  164.             else
  165.                 g[u].push_back(i);
  166.         }
  167.  
  168.         for(i=0; i<=n+1; i++)
  169.         {
  170.             cnt[i]=0;
  171.             big[i]=0;
  172.         }
  173.  
  174.         val=0;
  175.  
  176.         calcSz(root, -1);
  177.         dfs(root, -1, 0);
  178.  
  179.         mp1.clear();
  180.         id=1;
  181.         for(i=1; i<=n; i++)
  182.         {
  183.             // cout<<seq[i]<<" ";
  184.             if(mp1[seq[i]]==0)
  185.                 mp1[seq[i]]=id++;
  186.             col[i]=mp1[seq[i]];
  187.         }
  188.         // cout<<endl;
  189.  
  190.  
  191.  
  192.         for(i=0; i<=n+1; i++)
  193.         {
  194.             cnt[i]=0;
  195.             big[i]=0;
  196.         }
  197.         val=0;
  198.  
  199.         dfs2(root, -1, 0);
  200.  
  201.  
  202.         for(i=1; i<=n; i++)
  203.             printf("%d ", res[i]);
  204.         printf("\n");
  205.  
  206.     }
  207.  
  208.     return 0;
  209. }
  210.  
Advertisement
Add Comment
Please, Sign In to add comment