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

k-d tree 模板

找了好几天才发现输出优化错了....真是zz......

当子树非常不平衡时,就用替罪羊树的思想,拍扁重建。

luogu有个点开了O2才过.......

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
char c;void read(int &x){
c=getchar();x=;int f=;
while(!isdigit(c)) c=getchar(),f=(f&&c!='-');
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
x=f?x:-x;
}
void print(int x){
if(x<) putchar('-'),x=-x;
if(x>) print(x/);
putchar(x%+);
}
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline int abs(int a){return a<?-a:a;}
#define N 1000010
#define alph (0.75)
#define inf 1e9+7
int n,m,rt,u,ans;
int lit[N],tp1,tp2;
int d;struct node{
int p[];
void init(){read(p[]);read(p[]);}
bool operator < (const node &t) const{
return p[d]<t.p[d];
}
}b[N];
struct data{int mx[],my[],ch[],sz,fa;node ad;}a[N];
#define lc a[o].ch[0]
#define rc a[o].ch[1]
inline void up(int o){
a[o].mx[]=max(a[o].mx[],max(a[lc].mx[],a[rc].mx[]));
a[o].mx[]=min(a[o].mx[],min(a[lc].mx[],a[rc].mx[]));
a[o].my[]=max(a[o].my[],max(a[lc].my[],a[rc].my[]));
a[o].my[]=min(a[o].my[],min(a[lc].my[],a[rc].my[]));
a[o].sz=a[lc].sz+a[rc].sz+;
}
inline void news(int &o,node w){
o=tp1?lit[tp1--]:++u; a[o].ad=w;
lc=rc=; a[o].sz=;
a[o].mx[]=a[o].mx[]=w.p[];
a[o].my[]=a[o].my[]=w.p[];
}
void build(int &o,int l,int r,int wd){
if(l>r) return ;
int mid=l+((r-l)>>);
d=wd;nth_element(b+l,b+mid,b+r+);
news(o,b[mid]);
build(lc,l,mid-,wd^),a[lc].fa=o;
build(rc,mid+,r,wd^),a[rc].fa=o;
up(o);
}
void pia(int o){
if(lc) pia(lc);
lit[++tp1]=o; b[++tp2]=a[o].ad;
if(rc) pia(rc);
}
inline void check(int &o,int wd){
if(alph*a[o].sz<max(a[lc].sz,a[rc].sz))
tp2=,pia(o),build(o,,tp2,wd);
}//是否不平衡需要重建
void ins(int &o,int wd,node w){
if(!o) {news(o,w); return ;}
d=wd;ins(a[o].ch[a[o].ad<w],wd^,w);
up(o);check(o,wd);
}
inline int gdis(int o,node w){
if(!o) return inf;
int res=;
if(w.p[]>a[o].mx[]) res+=w.p[]-a[o].mx[];
if(w.p[]<a[o].mx[]) res+=a[o].mx[]-w.p[];
if(w.p[]>a[o].my[]) res+=w.p[]-a[o].my[];
if(w.p[]<a[o].my[]) res+=a[o].my[]-w.p[];
return res;
}//点与矩形的最小距离
inline int dis(node A,node B){
return abs(A.p[]-B.p[])+abs(A.p[]-B.p[]);
}
void query(int o,node w){
if(!o) return ;
ans=min(ans,dis(a[o].ad,w));
int D[]={gdis(lc,w),gdis(rc,w)},r=D[]>D[];
if(D[r]<ans) query(a[o].ch[r],w);
if(D[r^]<ans) query(a[o].ch[r^],w);
}
int main(){
read(n);read(m);
a[].mx[]=a[].my[]=-inf;
a[].mx[]=a[].my[]=inf;
for(register int i=;i<=n;++i) b[i].init();
build(rt,,n,); node q1;
for(register int i=,q2;i<=m;++i){
read(q2); q1.init();
if(q2==) ins(rt,,q1);
else{
ans=inf,query(rt,q1);
print(ans); putchar('\n');
}
}return ;
}

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

  1. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  2. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

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

    题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...

  4. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子

    %%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...

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

    传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...

  6. luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree

    P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...

  7. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

  8. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...

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

    题意 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇 ...

随机推荐

  1. mac 安装geckodriver和chromedriver

    Last login: Fri Apr :: on ttys000 (base) localhost:~ ligaijiang$ env TERM_PROGRAM=Apple_Terminal SHE ...

  2. [LeetCode] 696. Count Binary Substrings_Easy

    利用group, 将每个连着的0或者1计数并且append进入group里面, 然后再将group里面的两两比较, 得到min, 并且加入到ans即可.   T: O(n)   S: O(n)  比较 ...

  3. websocket协议的思考

    同过wireshark抓包,都是TCP的连接,省了好多的HTTP的头部请求 Ping Pong,TCP keep alive,双方没有数据来往的时候,通过发空白报文,侦测的报文来决定看这个链接是否还存 ...

  4. 数据加密之RijndaelManaged加密

    #region RijndaelManaged加密 /// <summary> /// 加密数据 /// </summary> /// <param name=" ...

  5. .NET 黑魔法 - 自定义日志扩展

    我们开发程序时避免不了要有日志系统,我们希望有一个通用的.不夹杂任何方言的调用方式,简单地说就是保留微软日志框架的注入方式和使用方式. 比如我们希望这样调用: 我们不希望有个 IAbcLogger, ...

  6. strlen实现

    1.strlen函数. 普通版实现方法, int strlen( char *s) { int length = 0; while(*s++) length++; return length; } 优 ...

  7. QT获取窗口句柄

    winId()函数 SendMessage((HWND)(this->dlg->winId()),WM_SEND_MY_MESSAGE,0,0);

  8. Nginx技术研究系列1-通过应用场景看Nginx的反向代理

    随着我们业务规模的不断增长,整个系统规模由两年前的几十台服务器,井喷到现在2个数据中心,接近400台服务器,上百个WebApi站点,上百个域名. 这么多的WebApi站点这么多的域名,管理和维护成本很 ...

  9. 利用sqoop将hive数据导入导出数据到mysql

    一.导入导出数据库常用命令语句 1)列出mysql数据库中的所有数据库命令  #  sqoop list-databases --connect jdbc:mysql://localhost:3306 ...

  10. hive 常见时间日期函数的使用

    1.时间戳函数 日期转时间戳:从1970-01-01 00:00:00 UTC到指定时间的秒数 获得当前时区的UNIX时间戳: select unix_timestamp(); 1533716607 ...