[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. 二维码生成器,基于python,segno库

    import segno temp = input("Please enter value:") qr = segno.make(temp) qr.save("qrcod ...

  2. Springboot War包部署下nacos无法注册问题

    目录 1. @EnableDiscoveryClient的使用 2. EnableDiscoveryClientImportSelector类的作用 3.AutoServiceRegistration ...

  3. git-ssh-keygen

    ssh-keygen 先看本地是否已经有了密钥 cd ~/.ssh 该文件夹下会包含两个文件 id_rsa --私钥 id_rsa.pub --公钥 如果没有这两个文件的话就需要重新生成(有的话使用一 ...

  4. rabbitmq部署安装

    1.安装rabbitmq需要提前安装erlang,相关下载地址:http://www.erlang.org/downloads,需要注意:默认安装的RabbitMQ 监听端口是5672     启动和 ...

  5. WEB应用安全解决方案测试验证

    WEB应用安全解决方案测试报告 --- By jiang.jx at 2017-08-11 WEB应用安全解决方案.docx 链接:https://share.weiyun.com/068b05467 ...

  6. k3 cloud中出现合计和汇总以后没有显示出来,合价要新增一行以后才出现值

    解决办法:找到对应字段,把及时触发值更新事件打上勾

  7. Java加密与解密的艺术 读书心得

    现在项目中加密与解密的方式很多,很早就想整理一下Java中加密与解密的方式,读完<<Java加密与解密的艺术>>一书.借此机会梳理一下这方面的知识点 一.基础普及 安全技术目标 ...

  8. 246-基于TI DSP TMS320C6678、Altera FPGA的CPCI处理卡

    基于TI DSP TMS320C6678.Altera FPGA的CPCI处理卡 1.板卡概述  本板卡由我公司自主研发,基于CPCI架构,符合CPCI2.0标准,采用两片TI DSP TMS320C ...

  9. Java疯狂讲义笔记——Lambda表达式

    Java8新增的Lambda表达式 [特性]支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例. [组成部分]1,形参列表 ...

  10. python进行两个大数相加

    python进行两个大数相加:由于int类型32位或64位都有长度限制,超出会内存溢出,无法计算,那么解决方法如下: 思路: 1.将超长数转换成字符串 2.进行长度补零,即让两个要计算的字符串长度一样 ...