Advertisement
Guest User

Untitled

a guest
Aug 4th, 2018
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 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. long ans = 0;
  24. for (int i=n-1; i>=0; i--) {
  25.  
  26. // find first grandparent which has buyers available (or possible root with 0 buyers)
  27. int gp = i;
  28. while (c[gp] == 0 && gp != 0) gp = parents[gp];
  29.  
  30. // speedup future searches by marking this grandparent to all nodes within this path
  31. int curr = i;
  32. while (curr != gp) {
  33. int next = parents[curr];
  34. parents[curr] = gp;
  35. curr = next;
  36. }
  37.  
  38. // if grandparent has buyers available, spend 1 buyer on candy i
  39. if (c[gp] > 0) {
  40. c[gp]--;
  41. ans += i;
  42. }
  43. }
  44.  
  45. io.println(ans);
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement