Bzoj2648 SJY摆棋子
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 3128 Solved: 1067
Description
Input
Output
Sample Input
1 1
2 3
2 1 2
1 3 3
2 4 2
Sample Output
2
HINT
kdtree可以过
Source
K-Dtree模板题
似乎有种懂了的错觉
(錯覚?それでは、聞いてください....)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int INF=1e9;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
return x*f;
}
int nowD;
struct node{
int min[],max[];
int d[];
int l,r;
}t[mxn<<];
int root,nct=;
int cmp(const node a,const node b){
if(a.d[nowD]==b.d[nowD])return a.d[nowD^]<b.d[nowD^];
return a.d[nowD]<b.d[nowD];
}
int qx,qy;//查询参数
void pushup(int rt,int c){//更新结点信息
t[rt].max[]=max(t[rt].max[],t[c].max[]);
t[rt].min[]=min(t[rt].min[],t[c].min[]);
t[rt].max[]=max(t[rt].max[],t[c].max[]);
t[rt].min[]=min(t[rt].min[],t[c].min[]);
return;
}
int Build(int l,int r,int D){
nowD=D;int mid=(l+r)>>;
nth_element(t+l,t+mid,t+r+,cmp);
t[mid].max[]=t[mid].min[]=t[mid].d[];
t[mid].max[]=t[mid].min[]=t[mid].d[];
if(l!=mid) t[mid].l=Build(l,mid-,D^);
if(r!=mid) t[mid].r=Build(mid+,r,D^);
if(t[mid].l)pushup(mid,t[mid].l);
if(t[mid].r)pushup(mid,t[mid].r);
return mid;
}
void insert(int x){//插入新结点
int now=root,D=;
while(){
pushup(now,x);
if(t[x].d[D]>=t[now].d[D]){
if(!t[now].r){t[now].r=x;return;}
else now=t[now].r;
}
else{
if(!t[now].l){t[now].l=x;return;}
else now=t[now].l;
}
D^=;
}
return;
}
int Dist(int k){//估价
int res=;
if(qx<t[k].min[])res+=t[k].min[]-qx;
if(qx>t[k].max[])res+=qx-t[k].max[];
if(qy<t[k].min[])res+=t[k].min[]-qy;
if(qy>t[k].max[])res+=qy-t[k].max[];
return res;
}
int ans;
void query(int rt){
int dx,dy,tmp;
// printf("rt:%d pos:%d %d ans:%d\n",rt,t[rt].d[0],t[rt].d[1],ans);
tmp=abs(t[rt].d[]-qx)+abs(t[rt].d[]-qy);
if(tmp<ans)ans=tmp;
if(t[rt].l) dx=Dist(t[rt].l);else dx=INF;
if(t[rt].r) dy=Dist(t[rt].r);else dy=INF;
if(dx<dy){
if(dx<ans) query(t[rt].l);
if(dy<ans) query(t[rt].r);
}
else{
if(dy<ans) query(t[rt].r);
if(dx<ans) query(t[rt].l);
}
return;
}
int n,m;
int main(){
int i,j;
n=read();m=read();
int T,x,y;
for(i=;i<=n;i++){
t[++nct].d[]=read();
t[nct].d[]=read();
}
root=Build(,n,);
while(m--){
T=read();x=read();y=read();
if(T==){
t[++nct].d[]=x; t[nct].d[]=y;
t[nct].max[]=t[nct].min[]=t[nct].d[];
t[nct].max[]=t[nct].min[]=t[nct].d[];
insert(nct);
}
else{
qx=x;qy=y;ans=INF;
query(root);
printf("%d\n",ans);
}
}
return ;
}
Bzoj2648 SJY摆棋子的更多相关文章
- 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摆棋子(KD-Tree)
板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- 【kd-tree】bzoj2648 SJY摆棋子
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)
传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...
- KDTree(Bzoj2648: SJY摆棋子)
题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...
- [bzoj2648]SJY摆棋子(带插入kd-tree)
解题关键:带插入kdtree模板题. #include<iostream> #include<cstdio> #include<cstring> #include& ...
- luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree
k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...
- 【BZOJ2648】SJY摆棋子(KD-Tree)
[BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...
随机推荐
- MYSQL临时表创建索引
DROP TEMPORARY TABLE IF EXISTS tmp_record_t2;CREATE TEMPORARY TABLE tmp_record_t2(consumption_id INT ...
- node基础05:路由基础
1.基础实例 //server.js var http = require("http"); var url = require("url"); var rou ...
- redis 学习笔记(5)-Spring与Jedis的集成
首先不得不服Spring这个宇宙无敌的开源框架,几乎整合了所有流行的其它框架,http://projects.spring.io/spring-data/从这上面看,当下流行的redis.solr.h ...
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github 题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大.这是求连续最大子序列和的加强版,我们 ...
- 从源码角度看finish()方法的执行流程
1. finish()方法概览 首先我们来看一下finish方法的无参版本的定义: /** * Call this when your activity is done and should be c ...
- java 环境配置
'JAVAC' 不是内部或外部命令解决方法 'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 'JAVA' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法相似. ...
- [转]Windows系统注册表知识完全揭密
来源:http://www.jb51.net/article/3328.htm Windows注册表是帮助Windows控制硬件.软件.用户环境和Windows界面的一套数据文件,注册表包含在Wind ...
- 关于提高python程序执行效率的思路和想法
相比编译型语言(C系列)python胜在简介的语法和优雅的动态编程体验,但是在执行效率上,python有解释性语言先天的劣势——执行效率较低,为了让编写出的程序获得更快的执行效率,开启此文章. pyt ...
- 一个奇怪的MySQL错误返回
(0, '') python查询结果,乍一看还以为是下标出错了 一番调试,发现是因为 mysql数据库连接关闭上出了错. 结尾 在对数据库进行操作的时候要注意连接的开启和关闭动作规范
- iOS 隐藏/去掉 导航栏返回按钮中的文字
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(, -) forBarMetrics:U ...