关于 cdq 套 cdq 的排序
查看原帖
关于 cdq 套 cdq 的排序
483928
Z1qqurat楼主2024/1/9 19:18

就是说因为第二层 cdq 会这样写嘛:

auto solve1(int l, int r) {
   if (l == r) return ;
   auto mid = l + r >> 1;
   solve1(l, mid);

   for (auto i = l; i <= r; ++i) z[i] = y[i], z[i].id = i;
   std::stable_sort(All(z, l, mid), [&] (Node x, Node y) { 
      return x.c == y.c ? (x.d == y.d ? (x.a == y.a ? x.b < y.b : x.a < y.a) : x.d < y.d) : x.c < y.c;
   });
   std::stable_sort(All(z, mid + 1, r), [&] (Node x, Node y) { 
      return x.c == y.c ? (x.d == y.d ? (x.a == y.a ? x.b < y.b : x.a < y.a) : x.d < y.d) : x.c < y.c;
   });
   auto p = l, q = mid + 1;
   while (q <= r) {
      while (p <= mid && z[p].c <= z[q].c) {
         if (!z[p].part) BIT::upd(z[p].d, z[p].f);
         p++;
      }
      if (z[q].part) z[q].f = std::max(z[q].f, BIT::ask(z[q].d) + z[q].e);
      q++;
   }

   for (auto i = l; i <= r; ++i) {
      y[z[i].id].f = z[i].f;
      if (i <= mid && !y[i].part) BIT::clear(y[i].d);
   }
   solve1(mid + 1, r);
   return ;
}

如果出现 a,b,c,da,b,c,d 都相同的点,那么肯定得是让 partpart 为 false 的优先,这样可以算出更长的子序列嘛,于是我就这样四个关键字排序,可以还是不太对,仍然会被全部相同的 hack 掉,改成 stable_sort 就对了。我知道 stable_sort 的正确性,但是能解释下为啥我之前那样排序是错的吗?之前错的(WA on Sub#0)code

2024/1/9 19:18
加载中...