[关闭]
@VecMD 2016-07-11T13:11:58.000000Z 字数 1592 阅读 1275

CF 675E

  1. #include <cstdio>
  2. #include <vector>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. const int maxn = 100007;
  7. int n, right[maxn];
  8. long long dp[maxn];
  9. struct SegTree{ int l, r, val, id; } seg[maxn * 4];
  10. void build(int l, int r, int k)
  11. {
  12. seg[k].l = l;
  13. seg[k].r = r;
  14. if(l == r){
  15. seg[k].id = l;
  16. seg[k].val = right[l];
  17. return;
  18. }
  19. int mid = (l + r) / 2;
  20. build(l, mid, 2 * k);
  21. build(mid + 1, r, 2 * k + 1);
  22. if(seg[2 * k].val > seg[2 * k + 1].val){
  23. seg[k].id = seg[2 * k].id;
  24. seg[k].val = seg[2 * k].val;
  25. } else {
  26. seg[k].id = seg[2 * k + 1].id;
  27. seg[k].val = seg[2 * k + 1].val;
  28. }
  29. }
  30. int ans, id;
  31. void ask(int l, int r, int k){
  32. if(l <= seg[k].l && seg[k].r <= r){
  33. if(ans <= seg[k].val){
  34. id = seg[k].id;
  35. ans = seg[k].val;
  36. }
  37. return;
  38. }
  39. int mid = (seg[k].l + seg[k].r) / 2;
  40. if(r <= mid) ask(l, r, 2 * k);
  41. else if(l > mid) ask(l, r, 2 * k + 1);
  42. else ask(l, mid, 2 * k), ask(mid + 1, r, 2 * k + 1);
  43. }
  44. int main()
  45. {
  46. std::cin >> n;
  47. right[n] = n;
  48. for(int i = 1; i < n; i ++){
  49. std::cin >> right[i];
  50. }
  51. build(1, n, 1);
  52. long long temp = 0;
  53. for(int i = n - 1; i > 0; i --){
  54. int l = i + 1, r = right[i];
  55. ans = 0;
  56. ask(l, r, 1);
  57. if(ans <= r) id = r;
  58. dp[i] = (n - i) + dp[id] - (r - id);
  59. temp += dp[i];
  60. }
  61. std::cout << temp << "\n";
  62. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注