警示后人(TLE)
查看原帖
警示后人(TLE)
678028
Water_Flower楼主2025/7/24 14:50

如果当前平衡树里面有一个出现非常非常多次的数,现在要有交合并,如果用普通的 FHQ split 实现的话,可能会导致把所有这个值的数分到同一边,可能会导致 FHQ 的深度退化成 O(n) 。优化的方法有很多,比如把相同的值合并,然后用并查集维护 https://www.luogu.com.cn/record/225773730 ;再比如做一个下标的放缩平移 https://www.luogu.com.cn/record/225535310 ;但我觉得我写的这个最方便:

  void split_rnd(int p, int k, int &x, int &y) {
      if(!p) {x = y = 0; return ;}
      dn(p);
      if(t[p].x < k || (t[p].x == k && rnd() % 2)) {x = p, split_rnd(rs, k, rs, y);}
      else {y = p, split_rnd(ls, k, x, ls);}
      up(p);
  }
2025/7/24 14:50
加载中...