Submission #1244149

#TimeUsernameProblemLanguageResultExecution timeMemory
1244149AlperenT_Tree (IOI24_tree)C++20
0 / 100
2095 ms21316 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 = 1e5 + 100 , inf = 1e18 , mod = 998244353; int n; std::vector<int> p, w; int h[maxn] , sz[maxn] ; vector <int >G[maxn] ; void bui(int v){ sz[v] = 1; for(int u : G[v]){ bui(u); sz[v] += sz[u] ; } } int st[maxn] , en[maxn] , id[maxn] , cnt = 0 ; ll l , r, ans =0 ; vector <int> tp ; void bui2(int v){ vector <pii> vec; id[v] = cnt ; tp.pb(v) ; st[v] = cnt ; cnt++ ; for(int u : G[v]){ vec.pb({sz[u] , u}); } sort(all(vec)); reverse(all(vec)); rep(i , 0 ,sz(vec)-1){ int u = vec[i].S ; if(i ==0 ){ h[u] = h[v] ; bui2(u); }else{ h[u] = u; bui2(u); } } en[v] = cnt-1 ; } struct node{ ll mn , sm ,id ; node(){ mn = sm = id =0 ; } };node seg[4*maxn] ; node operator+(node a , node b){ node r ; r.mn = min(a.mn , b.mn) ; ;r.id = a.id; if(r.mn == b.mn)r.id = b.id ; r.sm =0 ; return r ; } void buiseg(int p = 1, int l = 0 , int r = n-1){ int mid = (l+r)/2 ,pl=p<<1,pr=p<<1|1; if(l == r){ seg[p].mn = w[tp[l]]; seg[p].id = l ; seg[p].sm =0 ; return ; } buiseg(pl,l,mid); buiseg(pr ,mid+1,r); seg[p] = seg[pl] + seg[pr]; } void shi(int p){ int pl= p<<1 , pr =p<<1|1 ; seg[pl].sm+= seg[p].sm ; seg[pr].sm+= seg[p].sm ; seg[p].sm =0 ; } void upd(int le , int ri , int w , int p =1 , int l =0 , int r = n-1){ int mid = (l+r)/2 , pl=p<<1, pr=p<<1|1; if(le > r || l > ri)return; if(le <= l && r <= ri){ seg[p].sm += w ; return; } shi(p); upd(le,ri,w,pl,l,mid); upd(le,ri,w,pr,mid+1,r); seg[p] = seg[pl] + seg[pr]; } node que(int le ,int ri , int p =1 ,int l = 0,int r =n-1){ int mid = (l+r)/2 , pl=p<<1, pr=p<<1|1; if(le <= l && r <=ri)return seg[p]; shi(p) ; if(ri <= mid)return que(le,ri,pl,l,mid); if(le > mid)return que(le,ri,pr,mid+1,r); return que(le,ri,pl,l,mid) + que(le,ri,pr,mid+1,r); } void msir(int v, int w){ if(h[v]==0){ upd(0 , id[v] , w) ; return ; } upd(id[h[v]] , id[v] , w) ; v = p[h[v]] ; msir(v, w) ; } 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) ; } bui(0);bui2(0); } void rem(int x, int p =1 , int l =0 , int r = n-1){ int mid = (l+r)/2 , pl=p<<1, pr=p<<1|1; if(x > r || l > x)return; if(l == r){ seg[p].mn = inf ; return; } shi(p); rem(x,pl,l,mid); rem(x,pr,mid+1,r); seg[p] = seg[pl] + seg[pr]; } int f(int v){return que(v,v).sm ;} void dfs(int v){ if(sz(G[v]) == 0){ msir(v, l) ; ans += 1ll * l * w[v] ; return; } for(int u : G[v]){ dfs(u); } while(f(v) > r){ node a =que(st[v] , en[v]) ; int u = tp[a.id] ; if(f(u) == l){ rem(a.id); continue ; } ll x = min(f(v)-r ,f(u) - l) ; ans += x * w[u] ; msir(u, -x) ; } } long long query(int L2, int R2) { buiseg(); ans = 0; l= L2 ; r= R2 ; 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...