【LG4169】[Violet]天使玩偶/SJY摆棋子
【LG4169】[Violet]天使玩偶/SJY摆棋子
题面
题解
至于\(cdq\)分治的解法,以前写过
\(kdTree\)的解法好像还\(sb\)一些
就是记一下子树的横、纵坐标最值然后求一下点到矩形得到距离
之后再剪枝即可
为什么不吸氧还是跑不过啊
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
void chkmin(int &x, int y) { if (x > y) x = y; }
void chkmax(int &x, int y) { if (x < y) x = y; }
const int MAX_N = 1e6 + 5;
const double alpha = 0.75;
const int INF = 1e9;
struct Point { int x[2]; } p[MAX_N];
struct Node {
int mn[2], mx[2], ls, rs, size;
Point tp;
} t[MAX_N];
int N, M, rt, cur, top, WD, ans, rub[MAX_N];
bool operator < (const Point &l, const Point &r) { return l.x[WD] < r.x[WD]; }
int newnode() {
if (top) return rub[top--];
else return ++cur;
}
void pushup(int o) {
int ls = t[o].ls, rs = t[o].rs;
for (int i = 0; i <= 1; i++) {
t[o].mn[i] = t[o].mx[i] = t[o].tp.x[i];
if (ls) chkmin(t[o].mn[i], t[ls].mn[i]), chkmax(t[o].mx[i], t[ls].mx[i]);
if (rs) chkmin(t[o].mn[i], t[rs].mn[i]), chkmax(t[o].mx[i], t[rs].mx[i]);
}
t[o].size = t[ls].size + t[rs].size + 1;
}
int build(int l, int r, int wd) {
if (l > r) return 0;
int o = newnode(), mid = (l + r) >> 1;
WD = wd, nth_element(&p[l], &p[mid], &p[r + 1]), t[o].tp = p[mid];
t[o].ls = build(l, mid - 1, wd ^ 1), t[o].rs = build(mid + 1, r, wd ^ 1);
return pushup(o), o;
}
void pia(int o, int num) {
if (t[o].ls) pia(t[o].ls, num);
p[num + t[t[o].ls].size + 1] = t[o].tp, rub[++top] = o;
if (t[o].rs) pia(t[o].rs, num + t[t[o].ls].size + 1);
}
void check(int &o, int wd) {
if (alpha * t[o].size < t[t[o].ls].size || alpha * t[o].size < t[t[o].rs].size)
pia(o, 0), o = build(1, t[o].size, wd);
}
void insert(int &o, int wd, Point tmp) {
if (!o) return (void)(o = newnode(), t[o].tp = tmp, t[o].ls = t[o].rs = 0, pushup(o));
if (t[o].tp.x[wd] < tmp.x[wd]) insert(t[o].r
91s, wd ^ 1, tmp);
else insert(t[o].ls, wd ^ 1, tmp);
pushup(o), check(o, wd);
}
int getdis(int o, Point tmp) {
int res = 0;
for (int i = 0; i <= 1; i++) res += max(0, tmp.x[i] - t[o].mx[i]) + max(0, t[o].mn[i] - tmp.x[i]);
return res;
}
int dist(Point a, Point b) { return abs(a.x[0] - b.x[0]) + abs(a.x[1] - b.x[1]); }
void query(int o, Point tmp) {
ans = min(ans, dist(tmp, t[o].tp));
int dl = INF, dr = INF;
if (t[o].ls) dl = getdis(t[o].ls, tmp);
if (t[o].rs) dr = getdis(t[o].rs, tmp);
if (dl < dr) {
if (dl < ans) query(t[o].ls, tmp);
if (dr < ans) query(t[o].rs, tmp);
} else {
if (dr < ans) query(t[o].rs, tmp);
if (dl < ans) query(t[o].ls, tmp);
}
}
int main () {
N = gi(), M = gi();
for (int i = 1; i <= N; i++) p[i].x[0] = gi(), p[i].x[1] = gi();
rt = build(1, N, 0);
while (M--) {
Point tmp;
int op = gi(); tmp.x[0] = gi(), tmp.x[1] = gi();
if (op == 1) insert(rt, 0, tmp);
else ans = INF, query(rt, tmp), printf("%d\n", ans);
}
return 0;
}
【LG4169】[Violet]天使玩偶/SJY摆棋子的更多相关文章
- LG4169 [Violet]天使玩偶/SJY摆棋子
题意 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇 ...
- bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...
- 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告
P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...
- luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree
P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)
[Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...
- [Violet]天使玩偶/SJY摆棋子 [cdq分治]
P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...
- P4169 [Violet]天使玩偶/SJY摆棋子
题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子
%%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...
- Luogu P4169 [Violet]天使玩偶/SJY摆棋子
传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...
随机推荐
- 「CF1025D Recovering BST」
题目 郑州讲过的题了 发现这是一个二叉搜索树,给出的还是中序遍历,我们很自然的想到我们需要可以用一个\(f[i][j][k](k\in[i,j])\)来表示区间\([i,j]\)能不能形成以\(k\) ...
- Kali-linux在树莓派上破解无线网络
大部分的命令可以正常的运行在BackTrack5或Kali上.在Kali上可以实现的无线渗透测试,在树莓派上也可以运行.在第1章中介绍了在树莓派上安装Kali Linux操作系统,下面将介绍在树莓派上 ...
- html5物理定位误差大 解决办法
学生党在做比赛作品,项目中需求要用到定位功能并以地图形式展现.所以思路就是用h5的geolocation 获取经纬度,通过百度地图api将经纬度转换成详细的地址以及地图.在笔记本电脑做测试,定位总有超 ...
- 基于maven的JavaWeb项目构建部署
需要准备的安装文件: 1 JDk http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html jdk-8 ...
- Boost noncopyable实现禁止拷贝的类
在C++中定义一个类,如果不明确定义拷贝构造函数和拷贝赋值操作符,编译期会为我们自动生成这两个函数.但是我们有时又希望禁止拷贝类的实例,这时可以私有化拷贝构造函数和拷贝赋值操作符即可. class d ...
- 如何导出SHP文件中的点坐标?(ArcGIS10)
行政区域坐标,网上流传较广的版本是包括海域的,假如你仅仅想要把陆地边界绘出,那么怎么办呢? 现在讲一下用arcgis 10从shp线.面文件中获取对应区域的坐标呢?(点图层忽略第一步) 首先用在arc ...
- [微信小程序] js变量名称写活
function create_variable(num){ var name = "test_"+num; //生成函数名 window[name] = 100; window[ ...
- iview admin 生成环境打包时路径问题
关于生产打包路径不对,字体图标引用错误的问题.以下是解决方案供参考:1.webpack.base.config.js 17行修改为: path: path.resolve(__dirname, '.. ...
- Ubuntu修改桌面为Desktop
想用中文系统,却不想用中文文件夹,可以用以下方法: 先把home路径下的桌面文件夹修改为Desktop 然后在命令行输入 nano ~/.config/user-dirs.dirs 修改后ctrl - ...
- linux的用户管理相关配置文件
Linux的管理命令的本质不过是对配置文件/etc相关文件的修改罢了