2648: SJY摆棋子
2648: SJY摆棋子
https://www.lydsy.com/JudgeOnline/problem.php?id=2648
分析:
k-d tree 模板题。
代码:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- inline int read() {
- int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
- for (;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
- }
- const int N = ;
- const int DIM = ;
- const int INF = 1e9;
- #define lc T[rt].ch[0]
- #define rc T[rt].ch[1]
- struct Point {
- int x[];
- Point() {x[] = ,x[] = ;}
- Point(int a,int b) {x[] = a,x[] = b;}
- }P[N];
- struct KD_Tree {
- int ch[],mn[],mx[];
- Point p;
- }T[N<<];
- int Cur,CntNode,Ans,Root;
- inline bool cmp(Point a,Point b) {
- return a.x[Cur] < b.x[Cur];
- }
- inline void pushup(int rt) {
- for (int i=; i<DIM; ++i) {
- if (lc) T[rt].mn[i] = min(T[rt].mn[i],T[lc].mn[i]), T[rt].mx[i] = max(T[rt].mx[i],T[lc].mx[i]);
- if (rc) T[rt].mn[i] = min(T[rt].mn[i],T[rc].mn[i]), T[rt].mx[i] = max(T[rt].mx[i],T[rc].mx[i]); // -- rc - lc
- }
- }
- inline void NewNode(int rt,Point p) {
- T[rt].p = p;
- T[rt].mn[] = T[rt].mx[] = p.x[];
- T[rt].mn[] = T[rt].mx[] = p.x[];
- }
- int build(int l,int r,int cd) { // cd -- cur dimensions
- if (l > r) return ;
- int m = (l + r) >> ,rt = m;
- Cur = cd; nth_element(P+l, P+m, P+r+, cmp);
- NewNode(rt,P[m]);
- lc = build(l, m-, cd^);
- rc = build(m+, r, cd^);
- pushup(rt);
- return rt;
- }
- void Insert(Point p,int &rt,int cd) {
- if (!rt) {
- NewNode(rt = ++CntNode,p);return ;
- }
- if (p.x[cd] <= T[rt].p.x[cd]) Insert(p, lc, cd^);
- else Insert(p, rc, cd^);
- pushup(rt);
- }
- inline int dist(Point a,KD_Tree b) {
- int dis = ;
- if (a.x[] < b.mn[]) dis += b.mn[] - a.x[];
- if (a.x[] > b.mx[]) dis += a.x[] - b.mx[];
- if (a.x[] < b.mn[]) dis += b.mn[] - a.x[];
- if (a.x[] > b.mx[]) dis += a.x[] - b.mx[];
- return dis;
- }
- inline int dis(Point a,Point b) {
- return abs(a.x[] - b.x[]) + abs(a.x[] - b.x[]);
- }
- void query(Point p,int rt) {
- Ans = min(Ans,dis(p,T[rt].p)); // -- !!
- int dl = lc ? dist(p,T[lc]) : INF;
- int dr = rc ? dist(p,T[rc]) : INF;
- if (dl < dr) {
- if (dl < Ans) query(p,lc);
- if (dr < Ans) query(p,rc);
- }
- else {
- if (dr < Ans) query(p,rc);
- if (dl < Ans) query(p,lc);
- }
- }
- int main() {
- int n = read(),m = read();
- CntNode = n; // --- !!!
- for (int i=; i<=n; ++i)
- P[i].x[] = read(),P[i].x[] = read();
- Root = build(,n,);
- while (m--) {
- int opt = read(),x = read(),y = read();
- if (opt == ) Insert(Point(x,y),Root,);
- else {
- Ans = INF;
- query(Point(x,y),Root);
- printf("%d\n",Ans);
- }
- }
- return ;
- }
luogu上需要拍扁重构,否则会T,而bzoj上拍扁重构却不如不拍扁重构跑得快
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- inline int read() {
- int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
- for (;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
- }
- const int N = ;
- const int DIM = ;
- const int INF = 1e9;
- #define alpha 0.75
- #define lc T[rt].ch[0]
- #define rc T[rt].ch[1]
- struct Point {
- int x[];
- Point() {x[] = ,x[] = ;}
- Point(int a,int b) {x[] = a,x[] = b;}
- }P[N<<];
- struct KD_Tree {
- int ch[],mn[],mx[],sz;
- Point p;
- }T[N<<];
- int sk[N],Top,Cur,CntNode,Ans,Root;
- inline bool cmp(Point a,Point b) {
- return a.x[Cur] < b.x[Cur];
- }
- inline void pushup(int rt) {
- T[rt].sz = T[lc].sz + T[rc].sz + ; //-- +1!!!
- for (int i=; i<DIM; ++i) {
- if (lc) T[rt].mn[i] = min(T[rt].mn[i],T[lc].mn[i]), T[rt].mx[i] = max(T[rt].mx[i],T[lc].mx[i]);
- if (rc) T[rt].mn[i] = min(T[rt].mn[i],T[rc].mn[i]), T[rt].mx[i] = max(T[rt].mx[i],T[rc].mx[i]);
- }
- }
- inline void NewNode(int &rt,Point p) {
- rt = Top ? sk[Top--] : ++CntNode;
- T[rt].p = p;
- T[rt].sz = ; // --!!!
- T[rt].mn[] = T[rt].mx[] = p.x[];
- T[rt].mn[] = T[rt].mx[] = p.x[];
- }
- int build(int l,int r,int cd) { // cd -- cur dimensions
- if (l > r) return ;
- int m = (l + r) >> ,rt;
- Cur = cd; nth_element(P+l, P+m, P+r+, cmp);
- NewNode(rt,P[m]);
- lc = build(l, m-, cd^);
- rc = build(m+, r, cd^);
- pushup(rt);
- return rt;
- }
- void dfs(int rt,int num) {
- if (lc) dfs(lc, num);
- P[num+T[lc].sz+] = T[rt].p, sk[++Top] = rt;
- if (rc) dfs(rc, num+T[lc].sz+);
- }
- inline void check(int &rt,int cd) {
- if (alpha * T[rt].sz < T[lc].sz || alpha * T[rt].sz < T[rc].sz) {
- dfs(rt, );
- rt = build(, T[rt].sz, cd);
- }
- }
- void Insert(Point p,int &rt,int cd) {
- if (!rt) {
- NewNode(rt,p);return ;
- }
- if (p.x[cd] <= T[rt].p.x[cd]) Insert(p, lc, cd^);
- else Insert(p, rc, cd^);
- pushup(rt);check(rt,cd);
- }
- inline int dist(Point a,KD_Tree b) {
- int dis = ;
- if (a.x[] < b.mn[]) dis += b.mn[] - a.x[];
- if (a.x[] > b.mx[]) dis += a.x[] - b.mx[];
- if (a.x[] < b.mn[]) dis += b.mn[] - a.x[];
- if (a.x[] > b.mx[]) dis += a.x[] - b.mx[];
- return dis;
- }
- inline int dis(Point a,Point b) {
- return abs(a.x[] - b.x[]) + abs(a.x[] - b.x[]);
- }
- void query(Point p,int rt) {
- Ans = min(Ans,dis(p,T[rt].p)); // -- !!
- int dl = lc ? dist(p,T[lc]) : INF;
- int dr = rc ? dist(p,T[rc]) : INF;
- if (dl < dr) {
- if (dl < Ans) query(p,lc);
- if (dr < Ans) query(p,rc);
- }
- else {
- if (dr < Ans) query(p,rc);
- if (dl < Ans) query(p,lc);
- }
- }
- int main() {
- int n = read(),m = read();
- for (int i=; i<=n; ++i)
- P[i].x[] = read(),P[i].x[] = read();
- Root = build(,n,);
- while (m--) {
- int opt = read(),x = read(),y = read();
- if (opt == ) Insert(Point(x,y),Root,);
- else {
- Ans = INF;
- query(Point(x,y),Root);
- printf("%d\n",Ans);
- }
- }
- return ;
- }
2648: SJY摆棋子的更多相关文章
- BZOJ 2648: SJY摆棋子
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2968 Solved: 1011[Submit][Status][Disc ...
- BZOJ 2648: SJY摆棋子 kdtree
2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ 2648: SJY摆棋子(K-D Tree)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 6051 Solved: 2113[Submit][Status][Discuss] Descript ...
- bzoj 2648 SJY摆棋子 kd树
题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...
- BZOJ 2648 SJY摆棋子(KD Tree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...
- bzoj 2648 SJY摆棋子——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...
- bzoj 2648 SJY摆棋子 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 学习资料:https://blog.csdn.net/zhl30041839/arti ...
随机推荐
- 在VMware上安装ubuntu——网络类型
安装虚拟机时,向导提示选择网络类型: 当使用仅主机模式网络时,虚拟机和物理机不能互相访问共享.
- CentOS如何部署TinyProxy
TinyProxy是个非常便利,及容易架设的HTTP代理 安装方法 rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release- ...
- 从命令行运行Jmeter及jmeter参数说明、Html报告生成
为什么要命令行执行脚本,主要有以下三点: 1) 图形化界面消耗更多资源,CPU和内存 2) 图形化界面不支持大型的负载测试和性能测试 3) 命令行测试支持持续集成,例如放到Jenkins这样的CI工具 ...
- Hibernate的属性配置
Hibernate配置属性 hibernate.dialect Hibernate方言(Dialect)的类名 - 可以让Hibernate使用某些特定的数据库平台的特性 取值. full.class ...
- Windows下同时安装Anaconda2与Anaconda3
1. 安装一个作为主版本,比如先安装Anaconda2,安装时选择[添加path环境变量].我的安装地址为:E:\ProgramData\Anaconda3 2. 安装另一个版本python,安装时注 ...
- HDU 2859 Phalanx(对称矩阵 经典dp样例)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2859 Phalanx Time Limit: 10000/5000 MS (Java/Others) ...
- For macOS.百度网盘 破解SVIP、下载速度限制~
For macOS.百度网盘 破解SVIP.下载速度限制~ 是插件的 https://github.com/CodeTips/BaiduNetdiskPlugin-macOS 2019-01-03 让 ...
- cent os 上安装 matlab
下载和安装可以参考,这个链接: https://lanseyujie.com/post/matlab-download-and-activate.html 上面这链接,在创建桌面快捷键时,未能创建,c ...
- 虚拟内存设置(解决linux内存不够情况)
一. 虚拟内存介绍 背景介绍 Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级.所以,程序和数据如果在内存的话,会有非常快的读写速度.但是,内存的造价是要高于 ...
- let's encrypt部署免费泛域名证书
环境说明 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@localhos ...