P4169 [Violet]天使玩偶/SJY摆棋子

  1 // luogu-judger-enable-o2
  2 #include<cstdio>
  3 #include<iostream>
  4 using namespace std;
  5 const int maxn=1e7+10;
  6 const int inf=2e7+7;
  7 struct node
  8 {
  9     int x,y,id,ans,time;
 10 }a[maxn],b[maxn],tt[maxn];;
 11 int flag;
 12 int len,x,y;
 13 int n,q;
 14 struct XX
 15 {
 16     int c[maxn];
 17     int  lowbit(int x)
 18     {
 19         return x&(-x);
 20     }
 21     void update(int x,int w)
 22     {
 23         for(;x<=len;x+=lowbit(x))
 24         {
 25             c[x]=max(w,c[x]);
 26         }
 27     }
 28     int sum(int x)
 29     {
 30         int res=0;
 31         for(;x;x-=lowbit(x))
 32         {
 33             res=max(res,c[x]);
 34         }
 35         if(res)
 36         {
 37             return res;
 38         }
 39         else
 40         return -inf;
 41     }
 42     void clear(int x)
 43     {
 44         for(;c[x];x+=lowbit(x))
 45         {
 46             c[x]=0;
 47         }
 48     }
 49 }XX;
 50 void CDQ(int l,int r)
 51 {
 52     if(l == r) return;
 53     int mid =(l+r)>>1;
 54     CDQ (l,mid);
 55     CDQ(mid+1,r);
 56     int t1=l;
 57     int t2=mid+1;
 58     int k=l;
 59     while(t2<=r)
 60     {
 61         while(t1<=mid&&b[t1].x<=b[t2].x)
 62         {
 63             if(b[t1].time==1)
 64             {
 65                 XX.update(b[t1].y,b[t1].x+b[t1].y);
 66              }
 67              tt[k++]=b[t1++];
 68         }
 69         if(b[t2].time==2)
 70         {
 71             a[b[t2].id].ans=min(a[b[t2].id].ans,b[t2].x+b[t2].y-XX.sum(b[t2].y));
 72         }
 73         tt[k++]=b[t2++];
 74     }
 75     for(int i=l;i<=t1-1;i++)
 76     {
 77         if(b[i].time==1)
 78         {
 79             XX.clear(b[i].y);
 80         }
 81     }
 82
 83     while(t1<=mid)
 84     {
 85         tt[k++]=b[t1++];
 86     }
 87     for(int i=l;i<=r;i++)
 88     {
 89         b[i]=tt[i];
 90     }
 91 }
 92 void solve(int x1,int y1)
 93 {
 94     for(int i=1;i<=n+q;i++)
 95     {
 96         b[i]=a[i];
 97         if(x1)
 98         {
 99             b[i].x=len-b[i].x;
100         }
101         if(y1)
102         {
103             b[i].y=len-b[i].y;
104         }
105     }
106     CDQ(1,n+q);
107 }
108 int main()
109 {
110     scanf("%d%d",&n,&q);
111     for(int i=1;i<=n;i++)
112     {
113         scanf("%d%d",&x,&y);
114         a[i].time=1;
115         a[i].id=i;
116         a[i].x=++x;
117         a[i].y=++y;
118         len=max(len,max(x,y));
119     }
120     for(int i=n+1;i<=n+q;i++)
121     {
122         scanf("%d%d%d",&flag,&x,&y);
123         a[i].time=flag;
124         a[i].id=i;
125         a[i].x=++x;
126         a[i].y=++y;
127         a[i].ans=inf;
128         len=max(len,max(x,y));
129     }
130     len++;
131     solve(0,0);
132     solve(0,1);
133     solve(1,0);
134     solve(1,1);
135     for(int i=n+1;i<=n+q;i++)
136     {
137         if(a[i].time ==2)
138         {
139             printf("%d\n",a[i].ans);
140         }
141     }
142     return 0;
143  } 

原文地址:https://www.cnblogs.com/2529102757ab/p/10987796.html

时间: 2024-10-09 15:06:46

P4169 [Violet]天使玩偶/SJY摆棋子的相关文章

Luogu P4169 [Violet]天使玩偶/SJY摆棋子

传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点都在查询点的左下方,dis(A,B) = (Ax-Bx)+(Ay-By) = (Ax+Ay)-(Bx+By) 只要求满足Bx<Ax,By<Ay且Bx,By之和最大的点就好了. 那么如何把所有的点转化到该查询的左下呢? 对于每个查询,可以把一.二.四象限的点都通过对称转移到第三象限.但查询很多,不可

[Violet]天使玩偶/SJY摆棋子

Luogu4169 每次操作加入平面上一个点 , 或者询问离一个点最近的点的距离 CDQ分治模板 \(1.\)solve(l,mid); \(2.\)solve(mid+1,r); \(3.\)计算\([l,mid]\)中修改操作对\([mid+1,r]\)中查询操作的影响 /* ---------------------- [CDQ分治] 天使玩偶 1.solve(l,mid); 2.solve(mid+1,r); 3.计算[l,mid]中修改操作对[mid+1,r]中查询操作的影响 ----

[Luogu4169][Violet]天使玩偶/SJY摆棋子

luogu 题意 一个平面上有\(n\)个点,\(m\)次操作,每次新增一个点,或者是询问离某个点最近的点的距离.这里的距离是曼哈顿距离. \(n,m\le3*10^5\) sol 写一发\(CDQ\). 只考虑询问点在其他点的右上方的情况,假设询问点是\(A\),那么所求的距离就是\((X_A-X_i)+(Y_A-Y_i)=(X_A+Y_A)-(X_i+Y_i)\). 所以我们只需要找出满足\(X_i \le X_A,Y_i \le Y_A\)中\(X_i+Y_i\)的最大值就好了. \(CD

【bzoj2648&amp;bzoj2716】[Violet3]天使玩偶&amp;SJY摆棋子【kd树】

1BK捌脊允4iyo松纲06http://weibo.com/u/6264971116 382u60L86vl戎导屯http://www.docin.com/nqra496 u23j6h0敢d缴遮ahttp://www.facebolw.com/space/2104191 86褐2咕6镜y米0uhttp://huiyi.docin.com/sina_6352810924 160hA坷Yk闭苫6尾ehttp://shequ.docin.com/sina_6267166088 侍4E0pf范星17南

SJY摆棋子&amp;&amp;[Violet 3]天使玩偶

SJY摆棋子 https://www.lydsy.com/JudgeOnline/problem.php?id=2648 [Violet 3]天使玩偶 https://www.lydsy.com/JudgeOnline/problem.php?id=2716 参考博客:https://blog.csdn.net/Littlewhite520/article/details/78284697 KDtree模板题,带插入 1 #include<iostream> 2 #include<cst

【BZOJ-2648&amp;2716】SJY摆棋子&amp;天使玩偶 KD Tree

2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) .现在给出N<=500000

BZOJ 2648(SJY摆棋子-KD_Tree)

2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1180  Solved: 391 [Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) .现在给出N<=5000

【BZOJ2648】SJY摆棋子 [KD-tree]

SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子.此处的距离是 曼哈顿距离 即(|x1-x2|+|y1-y2|) .现在给出N个初始棋子,和M个操作.对于每个白色棋子,输出距离这个白色棋子最近的黑色棋子的

BZOJ 2648 SJY摆棋子 / 2716 Violet 3 天使玩偶 K-D树

题目大意:平面上有一些点,问一个点周围离它最近的点的曼哈顿距离是多少.支持动态加点. 思路:CDQ分治可以离线解决,但是SJY是卡CDQ的,天使玩偶可以过.毕竟K-D树的O(sqrt(n))的时间复杂度摆在那. K-D树理解起来其实不难,有k个维度的时候,每一层按照一个维度排序,取出按照这个维度排序的中位数,当作这个块的根,然后将这个块分开.还有一个比较重要的东西就是估价函数,这个函数根据不同的题可能不同.股价函数的主要用途就是对搜索进行剪枝,如果估价函数就已经大于当前的最优答案了,那就不用搜这