orazma

H.cpp

Sep 8th, 2026
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define ll long long
  5. #define pb push_back
  6. #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  7. #define mp make_pair
  8.  
  9. using namespace std;
  10.  
  11. const int MAXN = 1e6 + 5;
  12. const int INF = 1e9 + 7;
  13. const int MOD = 1e9 + 7;
  14.  
  15. pair <int, int> a[MAXN];
  16. int dp[MAXN];
  17.  
  18. void dfs(int v){
  19.  
  20.     left_num[v] = -1;
  21.     right_num[v] = -1;
  22.     if (g[v].size() == 0 && v != 1){
  23.         cnt_child[v] = 1;
  24.         left_num[v] = a[v];
  25.         right_num[v] = a[v];
  26.     }
  27.     for (int to : g[v]){
  28.         dfs(to);
  29.         cnt_child[v] += cnt_child[to];
  30.     }
  31.  
  32.     int k = g[v].size();
  33.     for (int i = 0; i < k; i++){
  34.         g[v].pb(g[v][i]);
  35.     }
  36.     vector <int> dp(k + k);
  37.     dp[0] = 1;
  38.     for (int i = 1; i < k + k; i++){
  39.         int to1 = g[v][i];
  40.         int to2 = g[v][i - 1];
  41.         if (left_num[to1] - 1 == right_num[to2]){
  42.             dp[i] = dp[i - 1] + 1;
  43.         }
  44.         else{
  45.             dp[i] = 1;
  46.         }
  47.         if (dp[i] == k){
  48.             to1 = g[v][i];
  49.             to2 = g[v][i - k + 1];
  50.             if (cnt_child[v] == right_num[to1] - left_num[to2] + 1){
  51.                 left_num[v] = left_num[to2];
  52.                 right_num[v] = right_num[to1];
  53.             }
  54.             break;
  55.         }
  56.     }
  57. }
  58.  
  59. void solve(int Test){
  60.  
  61.     int n;
  62.     cin >> n;
  63.     for (int i = 2; i <= n; i++){
  64.         cin >> x;
  65.         g[i].pb(x);
  66.     }
  67.     for (int i = 1; i <= n; i++){
  68.         cin >> a[i];
  69.     }
  70.  
  71.     dfs(1);
  72.  
  73.  
  74.  
  75. }
  76.  
  77. main() {
  78.     IOS;
  79.     srand(time(0));
  80.     int t = 1;
  81.     cin >> t;
  82.     int T = 1;
  83.     while(t--){
  84.         solve(T);
  85.         T++;
  86.     }
  87. }
  88.  
  89.  
  90.  
Add Comment
Please, Sign In to add comment