Submission #1244106

#TimeUsernameProblemLanguageResultExecution timeMemory
1244106AlperenT_Tree (IOI24_tree)C++20
13 / 100
2097 ms50848 KiB
#include "tree.h" #include <bits/stdc++.h> #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #define pb push_back #define F first #define pii pair<ll,ll> #define all(a) a.begin(),a.end() #define S second #define sz(a) (int)a.size() #define rep(i , a , b) for(int i = (a) ; i <= (b) ; i++) #define per(i , a , b) for(int i = (a) ; i >= (b) ; i--) #define ld double #define ll long long using namespace std ; const ll maxn = 1e6 + 100 , inf = 1e18 , mod = 998244353; int n; std::vector<int> p, w; vector <int >G[maxn] ; void init(std::vector<int> P, std::vector<int> W) { p = P; w = W; n = (int)p.size(); rep(i ,1, n-1){ G[p[i]].pb(i) ; } } int l, r; ll ans =0 ; ll sb[maxn] ; pii dfs2(int v){ pii a = {inf , 0} ; if(sb[v] == l)return a ; a.F= w[v] ; a.S = v; for(int u : G[v]){ pii b = dfs2(u) ; if(b.F < a.F)a =b; } return a ; } void dfs(int v){ if(sz(G[v]) == 0){ sb[v] = l; ans += 1ll * l * w[v] ; return; } sb[v] =0 ; for(int u : G[v]){ dfs(u); sb[v] += sb[u] ; } while(sb[v] > r){ pii a = dfs2(v) ; ll x = min(sb[v]-r , sb[a.S] - l) ; sb[v] -=x ; ans += x * w[a.S] ; int z = a.S; while(z!=v){ sb[z] -= x ; z =p[z] ; } } } long long query(int L, int R) { ans = 0; l= L ; r = R ; dfs(0 ); return ans ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...