Advertisement
Guest User

Untitled

a guest
Feb 1st, 2015
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.95 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:66777216")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. //#include <bits/stdc++.h>
  4. //#include <unordered_set>
  5. //#include <unordered_map>
  6. #include <functional>
  7. #include <algorithm>
  8. #include <iostream>
  9. #include <sstream>
  10. #include <fstream>
  11. #include <cassert>
  12. #include <iomanip>
  13. #include <complex>
  14. #include <cstring>
  15. #include <cstdio>
  16. #include <bitset>
  17. #include <string>
  18. #include <vector>
  19. #include <ctime>
  20. #include <queue>
  21. #include <stack>
  22. #include <cmath>
  23. #include <list>
  24. #include <set>
  25. #include <map>
  26.  
  27. #define forn(i,n) for(int i = 0; i < (int)(n); ++ i)
  28. #define for1(i,n) for(int i = 1; i <= (int)(n); ++ i)
  29. #define fore(i,a,b) for(int i = (int)(a); i <= (int)(b); ++ i)
  30. #define ford(i,n) for(int i = (int)(n)-1; i >= 0; -- i)
  31. #define ford1(i,n) for(int i = (int)(n); i >= 1; -- i)
  32. #define fored(i,a,b) for(int i = (int)(b); i >= (int)(a);--i)
  33. #define mp make_pair
  34. #define pb push_back
  35. #define sz(v) ((int)((v).size()))
  36. #define all(v) (v).begin(), (v).end()
  37. #define FOR(i, n) for (int i = 0; i < (n); ++i)
  38. //#define FORE(it,c) for(__typeof(c).begin() it = (c).begin(); it!=(c).end(); ++it)
  39. //#define fi first
  40. //#define se second
  41.  
  42. using namespace std;
  43.  
  44. typedef unsigned long long ULL;
  45. typedef long long LL;
  46. typedef long double LD;
  47. typedef long long i64;
  48. typedef unsigned long long u64;
  49. typedef long double ld;
  50. typedef vector<bool> vb;
  51. typedef vector<int> vi;
  52. typedef vector<vi> vvi;
  53. typedef pair<int,int> pii;
  54. typedef pair<LL,LL> pll;
  55. typedef vector<pii> vpi;
  56. typedef vector<ld> vd;
  57. typedef pair<ld,ld> pdd;
  58. typedef vector<pdd> vpd;
  59.  
  60. const int N = 2*10+5, E = 20, L = 200;
  61. int n, p[ N ], d[ N ];
  62. vector< vi > graph(N);
  63. int tin[ N ], tmr, tout[ N ];
  64. LL P[ N ];
  65. int pa[ N ][ E+2 ];
  66. int h[ N ];
  67. void dfs(int v,LL di){
  68. for1(i,E-1)
  69. pa[v][i] = pa[ pa[v][i-1] ][i-1];
  70. tin[v] = ++ tmr;
  71. P[v] = di;
  72. forn(j,sz(graph[v])){
  73. int to = graph[v][j];
  74. pa[to][0] = v;
  75. h[to] = h[v]+1;
  76. dfs(to,di+d[to]);
  77. }
  78. tout[v] = tmr;
  79. }
  80. int f[ N ];
  81. void update(int v,int val){
  82. for(;v <= tmr;v+=v&(-v))
  83. f[v]+=val;
  84. }
  85. int get(int v){
  86. int res = 0;
  87. for(;v;v-=v&(-v))
  88. res+=f[v];
  89. return res;
  90. }
  91. int Q(int v){
  92. int res = get(tout[v]);
  93. if(tin[v]-1)
  94. res-=get(tin[v]-1);
  95. return res;
  96. }
  97. void ST(int v){
  98. update(tin[v],1);
  99. }
  100. bool parent(int v,int p){
  101. if(tin[v] <= tin[p] && tout[v] >= tout[p])
  102. return true;
  103. return false;
  104. }
  105. int ans[ N ];
  106. LL res[ N ];
  107. int q[ N ];
  108. bool mark[ N ];
  109. int par[ N ];
  110. int LCA(int a,int b){
  111. if(parent(a,b))return b;
  112. if(parent(b,a))return a;
  113. ford(j,E){
  114. if(!parent(b,pa[a][j]))
  115. a = pa[a][j];
  116. }
  117. return pa[a][0];
  118. }
  119. LL res1[ N ];
  120. void dfsinit(int v,int it){
  121. q[v] = 0;
  122. if(v < it)
  123. ++ q[v];
  124. forn(j,sz(graph[v])){
  125. int to = graph[v][j];
  126. dfsinit(to,it);
  127. q[v]+=q[to];
  128. }
  129. }
  130. void dfsinit2(int v, LL val){
  131. forn(j,sz(graph[v])){
  132. int to = graph[v][j];
  133. dfsinit2(to,val+(LL)d[to]*q[to]);
  134. }
  135. }
  136. void init(int it){
  137. //< it
  138. dfsinit(0,it);
  139. dfsinit2(0, 0);
  140. }
  141. bool dfsmark(int v){
  142. int q = 0;
  143. forn(j,sz(graph[v]))
  144. q+=dfsmark(graph[v][j]);
  145. if(q >= 2)
  146. mark[v] = 1;
  147. q+=mark[v];
  148. return q!=0;
  149. }
  150. void hetdfs(int v,int p){
  151. par[v] = p;
  152. forn(j,sz(graph[v]))
  153. hetdfs(graph[v][j],mark[v]?v:p);
  154. }
  155. LL T[ N ];
  156. void UP(int i){
  157. while(i){
  158. T[i]+=( P[i]-P[ par[i] ] );
  159. i = par[i];
  160. }
  161. }
  162. LL G(int i){
  163. LL res = 0;
  164. while(i){
  165. res+=T[i];
  166. i = par[i];
  167. }
  168. return res;
  169. }
  170. void solve(){
  171. scanf("%d", &n);
  172. for(int i = 1; i < n; ++ i){
  173. scanf("%d%d", &p[i], &d[i]);
  174. --p[i];
  175. graph[p[i]].pb(i);
  176. }
  177. dfs(0,0);
  178. int v0 = 0;
  179. ST(0);
  180. ans[1] = 0;
  181. for(int k = 2; k <= n; ++ k){
  182. res[k] = res[k-1]+P[k-1];
  183. int v = k-1;
  184. ST(v);
  185. if(2*Q(v) < k){
  186. int to = v;
  187. ford(j,E){
  188. int u = pa[to][j];
  189. if(2*Q(u) < k)
  190. to = u;
  191. }
  192. v = pa[to][0];
  193. }
  194. //2*Q(v) >= k lower
  195. if(2*Q(v0) < k){
  196. int to = v0;
  197. ford(j,E){
  198. int u = pa[to][j];
  199. if(2*Q(u) < k)
  200. to = u;
  201. }
  202. v0 = pa[to][0];
  203. }
  204. if(parent(v,v0))
  205. v0 = v;
  206. ans[k] = v0;
  207. //v0 or v
  208. }
  209. for(int it = 0; it < n; it+=L){
  210. init(it);
  211. forn(i,n){
  212. T[i] = 0;
  213. mark[i] = 0;
  214. }
  215. mark[0] = 1;
  216. for(int i = it;i < n && i < it+L; ++ i){
  217. //ans[i+1],i
  218. mark[ ans[i+1] ] = 1;
  219. mark[ i ] = 1;
  220. }
  221. dfsmark(0);
  222. hetdfs(0,0);
  223. for(int i = it; i < n && i < it+L; ++ i){
  224. int k = i+1;
  225. UP(i);
  226. LL val = G(i);
  227. int v = ans[k];
  228. cout<<res[k]+k*P[v]-2*(res1[v])-2*val<<endl;
  229. }
  230. }
  231. }
  232.  
  233. void testgen(){
  234. FILE * f = fopen("input.txt", "w");
  235. int T = 10;
  236. // srand(time(NULL));
  237. // fprintf(f, "%d\n", n);
  238.  
  239. fclose(f);
  240. }
  241. int main() {
  242. #ifdef LOCAL
  243. // testgen();
  244. freopen("input.txt", "r", stdin);
  245. // freopen("output.txt", "w", stdout);
  246. #else
  247. #define task ""
  248. // freopen(task".in", "r", stdin);
  249. // freopen(task".out", "w", stdout);
  250. #endif
  251.  
  252. cout<<fixed;
  253. cout.precision(15);
  254. cerr<<fixed;
  255. cerr.precision(12);
  256.  
  257. solve();
  258.  
  259. #ifdef LOCAL
  260. cerr<<"Execution time = "<<clock()/1000.0<<"ms\n";
  261. #endif
  262. return 0;
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement