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

求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\)

直接cdq 4次 考虑左上右上左下右下就可以了…略微卡常数…

#include <bits/stdc++.h>

#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
#define rep(i , j , k) for(int i = j ; i <= k ; i ++)
#define Rep(i , j , k) for(int i = j ; i >= k ; i --) using namespace std ;
using ll = long long ;
using pii = pair <int , int> ;
using vii = vector <int> ;
#define int long long
auto ot = [&]() { cerr << "ATS TXDY" << '\n' ; int ATS_nantf_txdy = true ; } ;
auto _ios = [&]() { ios :: sync_with_stdio(false) ; cin.tie(nullptr) ; cout.tie(nullptr) ; } ; namespace stO_ATS_Orz {
template < class T > void cmax(T & x , T y) { if(x < y) x = y ; }
template < class T > void cmin(T & x , T y) { if(x > y) x = y ; }
template < class T > void abs(T x) { if(x < 0) x = -x ; }
int n , q , opt , x , y , len ;
const int N = 1e7 + 10 ;
const int INF = 2e7 + 10 ;
struct Node {
int x , y , type , id , ans ;
} a[N] , b[N] , tem[N] ;
struct BIT {
int c[N] ;
int low(int x) { return x & -x ; }
void upd(int x , int y) {
for( ; x <= len ; x += low(x)) cmax(c[x] , y) ;
}
int qry(int x) {
int ans = 0 ;
for( ; x ; x ^= low(x)) cmax(ans , c[x]) ;
return ans ? ans : -INF ;
}
void clear(int x) {
for( ; c[x] ; x += low(x)) c[x] = 0 ;
}
} t ;
void cdq(int l , int r) {
if(l == r) { return ; }
int mid = l + r >> 1 ;
cdq(l , mid) ; cdq(mid + 1 , r) ;
int t1 = l , t2 = mid + 1 , k = l ;
while(t2 <= r) {
while(t1 <= mid && b[t1].x <= b[t2].x){
if(b[t1].type == 1) t.upd(b[t1].y , b[t1].x + b[t1].y) ;
tem[k ++] = b[t1 ++] ;
}
if(b[t2].type == 2) cmin(a[b[t2].id].ans , b[t2].x + b[t2].y - t.qry(b[t2].y)) ;
tem[k ++] = b[t2 ++] ;
}
for(int i = l ; i <= t1 - 1 ; i ++)
if(b[i].type == 1) t.clear(b[i].y) ;
while(t1 <= mid) tem[k ++] = b[t1 ++] ;
for(int i = l ; i <= r ; i ++) b[i] = tem[i] ;
}
void solve(int rx , int ry) {
for(int i = 1 ; i <= n + q ; i ++) {
b[i] = a[i] ;
if(rx) b[i].x = len - b[i].x ;
if(ry) b[i].y = len - b[i].y ;
}
cdq(1 , n + q) ;
}
void main() {
cin >> n >> q ;
for(int i = 1 ; i <= n ; i ++) {
int x , y ; cin >> x >> y ; ++ x ; ++ y ;
a[i] = { x , y , 1 , i } ;
cmax(len , max(x , y)) ;
}
for(int i = n + 1 ; i <= n + q ; i ++) {
int opt , x , y ; cin >> opt >> x >> y ; ++ x ; ++ y ;
a[i] = { x , y , opt , i , INF } ;
cmax(len , max(x , y)) ;
}
++ len ;
solve(0 , 0) ; solve(0 , 1) ; solve(1 , 0) ; solve(1 , 1) ;
for(int i = n + 1 ; i <= n + q ; i ++)
if(a[i].type == 2) cout << a[i].ans << '\n' ;
}
}
signed main() {
_ios() ; ot() ;
return stO_ATS_Orz :: main() , 0 ;
}

[Violet]天使玩偶/SJY摆棋子 [cdq分治]的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. C语言基础二 练习

    指出正确标识符 命名 l 只能由26个英文字母的大小写.10个阿拉伯数字0~9.下划线_组成 l 严格区分大小写,比如test和Test是2个不同的标识符 l 不能以数字开头 l 不可以使用关键字作为 ...

  2. Javascript 基础学习(四)js 的语句

    由于程序都是自上向下的顺序执行的,所以通过流程控制语句可以改变程序执行的顺序,或者反复的执行某一段的程序. 语句的分类 条件判断语句 条件分支语句 循环语句 条件判断语句 条件判断语句也称为if语句 ...

  3. cesium1.65api版本贴地贴模型标绘工具效果(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  4. AndroidStudio更新时报错:Connection Error,Temp directory inside installation

    场景 在将Android Studio的 .AndroidStudio目录修改为别的目录后,打开AS,提示更新,点击更新后提示: Connection Error,Temp directory ins ...

  5. Centos7没有IP地址,查看网络状态显示No suitable device found for this connection (devint match))

    今天打开虚拟机,使用 ifconfig 命令时,没有显示出 IP 地址 (更好的阅读体验可访问 这里 ) 使用 systemctl status network 命令查看网络状态 显示没有合适的网络装 ...

  6. 宿主机休眠后,虚拟机网络ping不通网关

    宿主机  win10 64位 虚拟机软件  vmware 15 虚拟机 centos 7 64位 网络模式:桥接模式 故障起因:  中午去吃饭,为了节省电费,把宿主机 windows 给休眠了 吃完饭 ...

  7. linux中压缩解压缩命令

    目录 gzip gunzip tar(打包压缩) tar(解包解压) zip unzip bzip2 bunzip2 gzip 解释 命令名称:gzip 命令英文原意:GUN zip 命令所在路径:/ ...

  8. 关于PHP连接上MySQL但不能插入数据

    出现这种情况,有三种可能 1.SQL语句有问题 insert into table_name(field1,field2...) values(value1,value2...); 先在MySQL中粘 ...

  9. python filter函数(40)

    一.filter函数简介 filter函数主要用来筛选数据,过滤掉不符合条件的元素,并返回一个迭代器对象,如果要转换为列表list或者元祖tuple,可以使用内置函数list() 或者内置函数tupl ...

  10. Redisson源码学习之RedissonFairLock

    博客待整理,先只是把源码看了.... 后面不再备注redis中的命令含义了,这样备注写太多了不好阅读. package org.redisson; import java.util.Arrays; i ...