天使玩偶 SJY擺棋子

2022-04-05 20:14:29 字數 1956 閱讀 3696

cdq分治的題目.

我們發現題目要我們求的\(|a_x-b_x|+|a_y-b_y|\)的絕對值號比較噁心.

試想一下怎麼去掉

如果所有的點都在我們當前求的點的左下方(就是只考慮在他坐下方的點對他的貢獻). 我們怎麼求?

那麼就要我們求\(min\)(假設\(a\)為詢問的點)

那麼其實就是讓我們求\(a_x+a_y-max(b_x+b_y)\)

也因為要滿足左下角的限制

其實就是滿足

\(b_x<=a_x\)同時滿足\(b_y<=a_y\)中最大的\(b_x+b_y\)

這個是可以直接cdq的

但是我們只考慮了左下方的點對他的貢獻,很明顯,這是不夠的

那麼我們就想辦法依次將左上,右上,右下全部轉化為左下

就是通過同最大值域的加減來改變他們的左邊但不改變相對關係

注意常數就好了

另外,這種情況下歸併排序的時間複雜度比快排優秀太多了

#includeusing namespace std;

const int n = 6e5 + 3;

const int m = 1e6 + 3;

const int inf = 2e9;

int n,m;

int max_x,max_y;

int ans[n];

struct qq[n],p[n],h[n];

q g[n];

struct bit

inline int query(int x)

inline void clear(int x)

}t;int xx[n],yy[n];

inline bool cmp1(q x,q y)

inline bool cmp2(q x,q y)

inline int read()

while(isdigit(ch))

if(flag) x = -x;

return x;

}inline void solve(int l,int r)

for(int i = l;i < now;++i) if(p[i].type == 1) t.clear(p[i].yi);

while(ll <= mid && rr <= r)

while(ll <= mid) h[++nn] = p[ll++];

while(rr <= r) h[++nn] = p[rr++];

for(int i = l;i <= r;++i) p[i] = h[i];

}inline void del()

for(int i = 1;i <= m;++i) p[i] = g[i];

}int main()

for(int i = 1;i <= m;++i)

n += m;

for(int i = 1;i <= n;++i) p[i] = q[i];

for(int i = 1;i <= n;++i) ans[i] = inf;

max_y = max(max_x,max_y) + 1;

solve(1,n);

for(int i = 1;i <= n;++i) p[i] = q[i],p[i].xi = max_y - p[i].xi;

solve(1,n);

for(int i = 1;i <= n;++i) p[i] = q[i],p[i].yi = max_y - p[i].yi;

solve(1,n);

for(int i = 1;i <= n;++i) p[i] = q[i],p[i].xi = max_y - p[i].xi,p[i].yi = max_y - p[i].yi;

solve(1,n);

for(int i = 1;i <= n;++i) if(ans[i] != inf) printf("%d\n",ans[i]);

return 0;

}

bzoj2648 sjy擺棋子 kd樹

這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上乙個黑色棋子,要麼放上乙個白色棋子,如果是白色棋子,他會找出距離這個白色棋子最近的黑色棋子。此處的距離是 曼哈頓距離 即 x1 x2 y1 y2 現在給出n 500000個初始棋子。和m 500000個操作。對於每個...

bzoj2648 kd樹 SJY擺棋子

2648 sjy擺棋子 time limit 20 sec memory limit 128 mb submit 4914 solved 1688 submit status discuss description 這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上...

bzoj2648 SJY擺棋子 k d樹

這天,sjy顯得無聊。在家自己玩。在乙個棋盤上,有n個黑色棋子。他每次要麼放到棋盤上乙個黑色棋子,要麼放上乙個白色棋子,如果是白色棋子,他會找出距離這個白色棋子最近的黑色棋子。此處的距離是 曼哈頓距離 即 x1 x2 y1 y2 現在給出n 500000個初始棋子。和m 500000個操作。對於每個...