bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】
大意:在二维平面内,给定n个点,m个操作。操作A:加入一个点;操作B:询问一个点与平面上加入的点的最近距离
不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T不封装会T
把初始存在的点也看成加点操作
首先,曼哈顿距离取绝对值很烦,所以我们可以通过转坐标,把左上 右上 左下 右下通过转坐标都变成左下,最后取个min即可。于是对于(x,y)左下的点(x1,y1),dis=x-x1+y-y1=(x+y)-(x1+y1),用树状数组维护前缀最小值x1+y1。
按时间序排列,时间序 x y 三维偏序做CDQ分治即可
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=,inf=1e9;
int n,m,maxx,ans[N];
struct BIT
{
int c[N];
int lb(int x)
{
return x&(-x);
}
void update(int x,int d)
{
for(int i=x;i<=maxx;i+=lb(i))
c[i]=max(c[i],d);
}
int ques(int x)
{
int ret=;
for(int i=x;i>=;i-=lb(i))
ret=max(ret,c[i]);
return ret;
}
void clear(int x)
{
for(int i=x;i<=maxx;i+=lb(i))
c[i] = ;
}
}bit;
struct qwe
{
int x,y,k,id;
bool operator < (const qwe& rhs) const
{
if(x != rhs.x)
return x < rhs.x;
return id < rhs.id;
}
}a[N];
struct CDQ
{
int n;
qwe T[N];
void init(int n)
{
this->n=n;
sort(a+,a+n+);
}
void solve(int L, int R)
{
if(L>=R)
return;
int M=(L+R)>>;
int p=L,q=M+;
for(int i=L;i<=R;i++)
if(a[i].id<=M)
T[p++]=a[i];
else
T[q++]=a[i];
for(int i=L;i<=R;i++)
a[i]=T[i];
solve(L,M);
solve(M+,R);
int i=M+,j=L;
for(;i<=R;i++)
if(a[i].k==)
{
for(;j<=M&&a[j].x<=a[i].x;j++)
if(a[j].k==)
bit.update(a[j].y,a[j].x+a[j].y);
int t=bit.ques(a[i].y);
if(t)
ans[a[i].id]=min(ans[a[i].id],a[i].x+a[i].y-t);
}
for(int i=L;i<j;i++)
if(a[i].k==)
bit.clear(a[i].y);
merge(a+L,a+M+,a+M+,a+R+,T+L);
for(int i=L;i<=R;i++)
a[i]=T[i];
}
}cdq;
int read()
{
int r=;
char p=getchar();
while(p>''||p<'')
p=getchar();
while(p>=''&&p<='')
{
r=r*+p-;
p=getchar();
}
return r;
}
int main()
{
n=read(),m=read();
for(int i=;i<=n;i++)
{
a[i].x=read()+;
a[i].y=read()+;
a[i].id=i;
a[i].k=;
maxx=max(maxx,max(a[i].x,a[i].y));
}
for(int i=n+;i<=n+m;i++)
{
a[i].k=read();
a[i].x=read()+;
a[i].y=read()+;
a[i].id=i;
maxx=max(maxx,max(a[i].x,a[i].y));
}
maxx++;
n+=m;
for(int i=;i<=n;i++)
ans[i]=inf;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
a[i].x=maxx-a[i].x;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
a[i].y=maxx-a[i].y;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
a[i].x=maxx-a[i].x;
cdq.init(n);
cdq.solve(,n);
for(int i=;i<=n;i++)
if(ans[i]!=inf)
printf("%d\n",ans[i]);
return ;
}
bzoj 2716 [Violet 3]天使玩偶 【CDQ分治】的更多相关文章
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- BZOJ 2716 Violet 3 天使玩偶 CDQ分治
题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- BZOJ 2716: [Violet 3]天使玩偶
2716: [Violet 3]天使玩偶 Time Limit: 80 Sec Memory Limit: 128 MBSubmit: 1473 Solved: 621[Submit][Statu ...
- bzoj 2716 [Violet 3]天使玩偶——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 第三道KDtree!仍旧是模板.还有CDQ分治做法,见下面. 数组迷之开大?(开6e5 ...
- BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree
[题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
随机推荐
- Unity ----- 对象池GameObjectPool
孙广东 2014.6.28 非常早之前看到的外国文章,认为不错,分享一下. 对象池在AssetStore中也是有非常多插件的,可是有些重了.自己写一个轻量的岂不是非常好. 当你须要创建大量某种类型对象 ...
- 8. Smarty3:模版中的内置函数
smarty3中对内置函数的修改比較大,加入了很多新的功能:变量声明.表达式,流程控制,函数.数组等.可是建议不要在模版中去使用过于复杂的逻辑,而是要尽量将一些程序设计逻辑写到PHP中,并在模版中採用 ...
- CodeVS2492 上帝造题的七分钟2(树状数组+并查集)
传送门 树状数组模板题.注意优化,假设某个数的值已经是1了的话.那么我们以后就不用对他进行操作了,这个能够用并查集实现. 这道题还有个坑的地方,给出查询区间端点的a,b,有可能a>b. #inc ...
- gcc在出现错误的时候停止编译 -Wfatal-errors
有时候我们编译一个大的项目的时候.会出现非常多错误使得屏幕堆满了非常多没用的信息.普通情况下我们须要找到首次出现错误的地方,在gcc中加入编译选项能够使编译停止在第一次出现错误的地方: $ gcc - ...
- NAND flash坏区
计算容量 厂家所说的4G指的是4 000 000 000字节,是按1000进制计算的,而电脑是按照1024进制计算的,所以标称为4G的NAND Flash理论容量是4 000 000 000 / 10 ...
- Ajax_HTTP请求以及响应
什么是HTTP请求? 就是从用户的浏览器端向服务器端发送请求 一个HTTP请求一般由四个部分组成 1.HTTP请求的方法或者动作,比如GET或者POST请求 2.请求的URL,也就是请求的地址 3.请 ...
- mongo-java-driver
http://mvnrepository.com/artifact/org.mongodb/mongo-java-driver/3.5.0 <!-- https://mvnrepository. ...
- redis06----消息订阅
使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 r1:>publish news "aaaaaa" "" ...
- lstat函数的使用【学习笔记】
通过lstat函数获取文件的类型的代码如下. #include "apue.h" int main(int argc,char *argv[]) { int i; struct s ...
- bzoj4406: [Wc2016]论战捆竹竿&&uoj#172. 【WC2016】论战捆竹竿
第二次在bzoj跑进前十竟然是因为在UOJ卡常致死 首先这个题其实就是一个无限背包 一般做法是同余最短路,就是bzoj2118: 墨墨的等式可以拿到30分的好成绩 背包是个卷积就分治FFT优化那么下面 ...