Advertisement
Guest User

Untitled

a guest
Aug 4th, 2018
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. void solve() {
  2. int n = scanner.nextInt();
  3. int m = scanner.nextInt();
  4. long a = scanner.nextInt();
  5. long b = scanner.nextInt();
  6. scanner.nextLine();
  7.  
  8. // create tree
  9. int[] parents = new int[n];
  10. for (int i=1; i<n; i++) {
  11. int p = scanner.nextInt();
  12. scanner.nextLine();
  13. parents[i] = p;
  14. }
  15.  
  16. // mark buyers for each node in tree
  17. int[] c = new int[n];
  18. for (int i=0; i<m; i++) {
  19. long v = (a * i + b) % n;
  20. c[(int) v]++;
  21. }
  22.  
  23. last = new int[n];
  24. for (int i=0; i<n; i++) last[i] = i;
  25.  
  26. long ans = 0;
  27. for (int i=n-1; i>=0; i--) {
  28.  
  29. // find first grandparent which has buyers available (or possible root with 0 buyers)
  30. int gp = last[i];
  31. while (c[gp] == 0 && parents[gp] != gp) gp = parents[gp];
  32.  
  33. // speedup future searches by marking this grandparent to all nodes within this path
  34. int update = last[i];
  35. while (update != gp) {
  36. last[update] = gp;
  37. update = parents[update];
  38. }
  39.  
  40. // if grandparent has buyers available, spend 1 buyer on candy i
  41. if (c[gp] > 0) {
  42. c[gp]--;
  43. ans += i;
  44. }
  45. }
  46.  
  47. io.println(ans);
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement