2019.01.14 bzoj2648: SJY摆棋子(kd-tree)
传送门
kd−treekd-treekd−tree模板题。
题意简述:支持在平面上插入一个点,求对于一个点的最近点对。
思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息
所以我用了kd−treekd-treekd−tree来做。
其实就是两个维度分别作为键值来建立二叉搜索树即可。
这道题在查询时可以通过判断下一层的有没有可能对答案有贡献来剪个枝。
由于蒟蒻暂时没写过方差划分因此时间很慢。
代码:
#include<bits/stdc++.h>
#define mid (l+r>>1)
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
typedef pair<int,int> pii;
const int N=1e6+5,inf=0x3f3f3f3f;
int n,m,mx[N][2],mn[N][2],son[N][2],ans,tot=0;
bool cmpdir;
struct Pot{
int a[2];
inline int&operator[](const int&k){return a[k];}
inline const int&operator[](const int&k)const{return a[k];}
}p[N];
inline bool cmp(const Pot&a,const Pot&b){return a[cmpdir]<b[cmpdir];}
inline void pushup(int p){
if(son[p][0]){
mn[p][0]=min(mn[p][0],mn[son[p][0]][0]);
mx[p][0]=max(mx[p][0],mx[son[p][0]][0]);
mn[p][1]=min(mn[p][1],mn[son[p][0]][1]);
mx[p][1]=max(mx[p][1],mx[son[p][0]][1]);
}
if(son[p][1]){
mn[p][0]=min(mn[p][0],mn[son[p][1]][0]);
mx[p][0]=max(mx[p][0],mx[son[p][1]][0]);
mn[p][1]=min(mn[p][1],mn[son[p][1]][1]);
mx[p][1]=max(mx[p][1],mx[son[p][1]][1]);
}
}
inline int build(int l,int r,bool d){
cmpdir=d;
nth_element(p+l,p+mid,p+r+1,cmp);
mn[mid][0]=mx[mid][0]=p[mid][0],mn[mid][1]=mx[mid][1]=p[mid][1];
if(l<mid)son[mid][0]=build(l,mid-1,d^1);
if(r>mid)son[mid][1]=build(mid+1,r,d^1);
return pushup(mid),mid;
}
inline void insert(int k,Pot v,bool d){
if(p[k][d]<=v[d]){
if(son[k][1])insert(son[k][1],v,d^1);
else{
p[son[k][1]=++tot]=v;
mx[tot][0]=mn[tot][0]=v[0];
mx[tot][1]=mn[tot][1]=v[1];
}
}
else{
if(son[k][0])insert(son[k][0],v,d^1);
else{
p[son[k][0]=++tot]=v;
mx[tot][0]=mn[tot][0]=v[0];
mx[tot][1]=mn[tot][1]=v[1];
}
}
pushup(k);
}
inline int ask(int k,Pot v){
int ret=0;
ret+=max(0,mn[k][0]-v[0]);
ret+=max(0,mn[k][1]-v[1]);
ret+=max(0,v[0]-mx[k][0]);
ret+=max(0,v[1]-mx[k][1]);
return ret;
}
inline int dist(Pot a,Pot b){return abs(a[0]-b[0])+abs(a[1]-b[1]);}
inline void query(int k,Pot v,bool d){
ans=min(ans,dist(p[k],v));
int al=inf,ar=inf;
if(son[k][0])al=ask(son[k][0],v);
if(son[k][1])ar=ask(son[k][1],v);
if(al<ar){
if(al<ans)query(son[k][0],v,d^1);
if(ar<ans)query(son[k][1],v,d^1);
}
else{
if(ar<ans)query(son[k][1],v,d^1);
if(al<ans)query(son[k][0],v,d^1);
}
}
int main(){
n=read(),m=read(),tot=0;
for(ri i=1,x,y;i<=n;++i)x=read(),y=read(),p[++tot]=(Pot){x,y};
for(ri rt=build(1,n,0),i=1,x,y,op;i<=m;++i){
op=read(),x=read(),y=read();
if(op==1)insert(rt,(Pot){x,y},0);
else ans=inf,query(rt,(Pot){x,y},0),cout<<ans<<'\n';
}
return 0;
}
2019.01.14 bzoj2648: SJY摆棋子(kd-tree)的更多相关文章
- luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree
k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...
- BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- [BZOJ2648] SJY摆棋子 kd-tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 5421 Solved: 1910[Submit][Status][Disc ...
- Bzoj2648 SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 3128 Solved: 1067 Description 这天,SJY显得无聊.在家自己玩.在一个 ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- 【kd-tree】bzoj2648 SJY摆棋子
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- BZOJ2648 SJY摆棋子(KD-Tree)
板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- [bzoj2648]SJY摆棋子(带插入kd-tree)
解题关键:带插入kdtree模板题. #include<iostream> #include<cstdio> #include<cstring> #include& ...
随机推荐
- Python 学习笔记---爬取海贼王动漫
最近无聊整理的爬虫代码,可以自动爬取腾讯动漫的任意漫画,思路如下: 1. 先获取想下载的动漫url, 这里用了 getUrls ,直接获取动漫的最后一章 2. 然后进入到该动漫去获取要下载的图片url ...
- js 小结
<script type="text/javascript"> var hotalAddJs = { makeSubmitDataHandler: function ( ...
- Linux 有线 校园网
1.首先在ifconfig命令在终端查看自己的ip地址,然后记录下来 2.然后用sudo -i 命令转换到root权限下 3.在自己家目录下输入pppoeconf 4.遇到username时,讲自己的 ...
- TZOJ 2648 小希的迷宫(并查集)
描述 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道 ...
- bbs项目中对反向查询和分组查询的具体的应用
我的数据库是按照下面的图片的方式设计的 然后看下model中代码 class User(models.Model): uid = models.AutoField(primary_key=True) ...
- python脚本linux上后台执行
1.脚本后加& 加了&以后可以使脚本在后台运行,这样的话你就可以继续工作了.但是有一个问题就是你关闭终端连接后,脚本会停止运行 python3 run.py >/dev/null ...
- Linux下的crontab定时执行任务详解
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“cr ...
- 如何查看Chrome浏览器保存的账号密码
之前告诉大家如何一键查看所有保存在IE里的所有密码(点击查看原文),现在来告诉大家如何一键查看Chrome浏览器的所有密码.某种意义上上,查看Chrome的密码比查看IE的更简单,因为查看IE密码还需 ...
- HR 常用事务代码
HR的键值权限查看: oosb 删除人员 : pu01 查看人员主数据:PA30 对人员进行入职.离职.调岗等基本操作:PA40 查看HR中的公式的意思:PE04 查看HR中的工资项:PE02 创建 ...
- input 原生上传文件(type = file)
1.表单上传文件的步骤: - 1)设置enctype 默认为:enctype="application/x-www-form-urlencoded"(一般不设置) 若要表单中有需要 ...