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

题目传送门

解题思路

用CDQ分治开了氧气跑过。

将输入给的顺序作为第一维的时间,x为第二维,y为第三维。对于距离一个询问(ax,ay),将询问分为四块,左上,右上,左下,右下,对于坐下,左下的dist即为ax+ay-max(bx+by)。所以只要查询时间小于自己的点里x+y最大的即可。对于其他四块,都可以转为左下,各自跑一遍CDQ。

代码如下

#include <bits/stdc++.h>

using namespace std;

int n, m;

const int N = 1e6+5;

struct T{
int t, x, y;
bool f;
T(){}
T(int t, int x, int y, bool f): t(t), x(x), y(y), f(f){}
}v[N], t[N], a[N]; int c[N]; int lowbit(int x)
{
return x & (-x);
} void update(int x, int v)
{
for(int i = x; i < N; i += lowbit(i))
c[i] = max(c[i], v);
} int query(int x)
{
int ans = -1;
for(int i = x; i > 0; i -= lowbit(i)){
ans = max(c[i], ans);
}
return ans;
} void clear(int x)
{
for(int i = x; i < N; i += lowbit(i))
c[i] = 0;
} int ans[N]; void CDQ(int l, int r)
{
if(l == r)
return;
int mid = (l + r) / 2;
CDQ(l, mid);
CDQ(mid + 1, r);
for(int i = l; i <= r; i ++)
t[i] = v[i];
int x = l, y = mid + 1;
int cnt = l - 1;
while(x <= mid || y <= r){
if(x <= mid && y <= r){
if(t[x].x <= t[y].x){
if(!t[x].f)update(t[x].y, t[x].x + t[x].y);
v[++cnt] = t[x];
++x;
}
else {
int r = query(t[y].y);
if(t[y].f && r) ans[t[y].t] = min(ans[t[y].t], t[y].x + t[y].y - r);
v[++cnt] = t[y];
++y;
}
}
else if(x <= mid){
if(!t[x].f)update(t[x].y, t[x].x + t[x].y);
v[++cnt] = t[x];
++x;
}
else {
int r = query(t[y].y);
if(t[y].f && r) ans[t[y].t] = min(ans[t[y].t], t[y].x + t[y].y - r);
v[++cnt] = t[y];
++y;
}
}
for(int i = l; i <= mid; i ++)
if(!t[i].f)clear(t[i].y);
} int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++){
int x, y;
scanf("%d%d", &x, &y);
v[i] = T(0, x + 1, y + 1, 0);
}
for(int i = 1; i <= m; i ++){
int t, x, y;
scanf("%d%d%d", &t, &x, &y);
v[n+i] = T(i, x + 1, y + 1, t - 1);
}
int lx, ly;
lx = ly = 0;
for(int i = 1; i <= n + m; i ++){
a[i] = v[i];
lx = max(lx, v[i].x + 1);
ly = max(ly, v[i].y + 1);
}
memset(ans, 0x3f, sizeof(ans));
CDQ(1, n + m);
for(int i = 1; i <= n + m; i ++){
v[i] = a[i];
v[i].x = lx - v[i].x;
}
CDQ(1, n + m);
for(int i = 1; i <= n + m; i ++){
v[i] = a[i];
v[i].y = ly - v[i].y;
}
CDQ(1, n + m);
for(int i = 1; i <= n + m; i ++){
v[i] = a[i];
v[i].x = lx - v[i].x;
v[i].y = ly - v[i].y;
}
CDQ(1, n + m);
for(int i = 1; i <= m; i ++){
if(a[i + n].f)
printf("%d\n", ans[i]);
}
return 0;
}

洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)的更多相关文章

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

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

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

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

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

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

  4. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Codeforces 1162D Chladni Figure(枚举因子)

    这个题好像可以直接暴力过.我是先用num[len]统计所有每个长度的数量有多少,假如在长度为len下,如果要考虑旋转后和原来图案保持一致,我们用a表示在一个旋转单位中有几个长度为len的线段,b表示有 ...

  2. 在win7下面清除samba用户的登录状态

    相信会有一部分刚开始测试samba服务器的人会有过这样的疑惑? 在win7下面使用一个samba用户的username和passwd登录过后,之后每次进去都是以这样的username和passwd进去 ...

  3. VUE小案例--简易计算器

    这个小案例主要时练习v-model的使用,功能并不完善 <!DOCTYPE html> <html lang="zh-CN"> <head> & ...

  4. 靶场练习--sqli(3&4)

    第三关 先解决一下第二关遗留下来的问题,嘻嘻.看来数据库原理应当过一遍~ 1.首先判断是否有SQL注入,然后再看是数字型.字符型.发现这里是字符型. 2.order by 查询字段数,记得后面要加一个 ...

  5. CMS(1)

    一周后,终于可以学习到可爱的渗透了哈哈哈.除了大哥给的CMS(其实可以算是只是在文件上传的时候了解一下),但是对于一个CMS完整的渗透思路,我还是不懂.首先感谢章老师给我的CMS源码哈哈哈,在我的日记 ...

  6. rabbitmq windows安装 及 centos安装

     windows安装如下: 安装方法如下网址: https://baijiahao.baidu.com/s?id=1605656085633071281&wfr=spider&for= ...

  7. surpace pro 检测维修记录

    1.大陆不在全球联保范围内. 2.不要升级系统(win 10 1709)容易键盘失去反应. 3.不要乱安装系统,官方有回复镜像包,记住系列号, 4.大陆没有维修的点,有问题着官方服务, 5.uefi设 ...

  8. OtterCTF - Reverse - Msg Me This

    原文地址:Msg Me This 题目 Category: Reverse Engineering Points: 500 Solves: 15 Description: Rick created a ...

  9. spring中引入多个quertz 注意事项

    每一个独立的调取任务 需起不同的名字,否则只有最后一个调度起作用其他不起作用

  10. 如何将 不确定的有穷自动机(NFA) 转化为 确定的有穷自动机(DFA) 并将DFA最简化

    一.从NFA到DFA的转换 例如下图: DFA的每个状态都是一个由NFA中的状态构成的集合,即NFA状态集合的一个子集 r =aa*bb*cc* 二.从带有ε-边的NFA到DFA的转换 r=0*1*2 ...