cdq里
inline void CDQsolve(int l, int r)
{
if (l == r) return ;
int mid = l + r >> 1;
CDQsolve(l, mid); CDQsolve(mid + 1, r);
int j = l;
for (int i = mid + 1; i <= r; ++i)
if (!p[i].f)
{
for (; j <= mid && p[j].x <= p[i].x; ++j)
if (p[j].f) Modify(p[j].y, p[j].x + p[j].y);
int tmp = Query(p[i].y);
if (tmp) CkMin(Ans[p[i].t], p[i].x + p[i].y - tmp);
}
for (int i = l; i < j; ++i)
if (p[i].f) Clear(p[i].y);
merge(p + l, p + mid + 1, p + mid + 1, p + r + 1, q + l);
for (int i = l; i <= r; ++i) p[i] = q[i];
}//此为第一篇题解
他的merge是按x排序?
那么我变成直接按x排序
inline void CDQsolve(int l, int r)
{
if (l == r) return ;
int mid = l + r >> 1;
CDQsolve(l, mid); CDQsolve(mid + 1, r);
sort(p+l,p+mid+1),sort(p+mid+1,p+r+r);
int j = l;
for (int i = mid + 1; i <= r; ++i)
if (!p[i].f)
{
for (; j <= mid && p[j].x <= p[i].x; ++j)
if (p[j].f) Modify(p[j].y, p[j].x + p[j].y);
int tmp = Query(p[i].y);
if (tmp) CkMin(Ans[p[i].t], p[i].x + p[i].y - tmp);
}
for (int i = l; i < j; ++i)
if (p[i].f) Clear(p[i].y);
// merge(p + l, p + mid + 1, p + mid + 1, p + r + 1, q + l);
// for (int i = l; i <= r; ++i) p[i] = q[i];
}
为什么又t又wa