cdq有个问题,玄关
查看原帖
cdq有个问题,玄关
1419569
Z_kazuha楼主2024/12/9 10:04

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

2024/12/9 10:04
加载中...