非常裸的KD-tree。然而我没学啊。

  考虑如何离线求一个点在平面中的曼哈顿最近点。

  绝对值显得有点麻烦,于是把绝对值拆开分情况讨论一波。对于横坐标小于该点的,记录对于纵坐标的前缀x+y最大值和后缀x-y最大值;横坐标大于该点的,记录对于纵坐标的前缀y-x最大值和后缀-y-x最大值。

  不过这样不太方便,不如直接给点翻转一下换个坐标。这样就可以只用考虑左下的情况了。

  那么这个题,cdq分治就好了。注意树状数组不能有0下标,以及初值设为-inf。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 300010
#define M 1000010
#define inf 10000000
int n,m,p,tree[M],stk[N<<],top=;
struct data
{
int op,x,y,i,ans;
bool operator <(const data&a) const
{
return x<a.x||x==a.x&&i<a.i;
}
}q[N],t[N];
struct data2
{
int x,y;
bool operator <(const data2&a) const
{
return x<a.x;
}
}a[N];
bool cmp(const data&a,const data&b)
{
return a.i<b.i;
}
void update(int k,int x){while (k<=p){stk[++top]=k;tree[k]=max(tree[k],x);k+=k&-k;}}
int getans(int k){int s=-inf;while (k){s=max(s,tree[k]);k-=k&-k;}return s;}
void solve(int l,int r)
{
if (l==r) return;
int mid=l+r>>;
solve(l,mid);
solve(mid+,r);
int i=l,j=mid+;
for (int k=l;k<=r;k++)
if (q[i]<q[j]&&i<=mid||j>r) t[k]=q[i++];
else t[k]=q[j++];
for (int k=l;k<=r;k++) q[k]=t[k];
for (int k=l;k<=r;k++)
if (q[k].op==&&q[k].i<=mid) update(q[k].y,q[k].x+q[k].y);
else if (q[k].op==&&q[k].i>mid) q[k].ans=min(q[k].ans,q[k].x+q[k].y-getans(q[k].y));
while (top) tree[stk[top--]]=-inf;
}
void work()
{
memset(tree,,sizeof(tree));
sort(a,a+m+);sort(q,q+n+);
int j=;
for (int i=;i<=n;i++)
if (q[i].op==)
{
while (j<m&&a[j+].x<=q[i].x) j++,update(a[j].y,a[j].x+a[j].y);
q[i].ans=min(q[i].ans,q[i].x+q[i].y-getans(q[i].y));
}
memset(tree,,sizeof(tree));
sort(q,q+n+,cmp);
top=;
solve(,n);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2716.in","r",stdin);
freopen("bzoj2716.out","w",stdout);
const char LL[]="%I64d";
#else
const char LL[]="%lld";
#endif
m=read(),n=read();
for (int i=;i<=m;i++) p=max(p,max(a[i].x=read()+,a[i].y=read()+)+);
for (int i=;i<=n;i++) q[i].op=read(),p=max(p,max(q[i].x=read()+,q[i].y=read()+)+),q[i].i=i,q[i].ans=inf;
work();
for (int i=;i<=m;i++) a[i].x=p-a[i].x;
for (int i=;i<=n;i++) q[i].x=p-q[i].x;
work();
for (int i=;i<=m;i++) a[i].y=p-a[i].y;
for (int i=;i<=n;i++) q[i].y=p-q[i].y;
work();
for (int i=;i<=m;i++) a[i].x=p-a[i].x;
for (int i=;i<=n;i++) q[i].x=p-q[i].x;
work();
sort(q+,q+n+,cmp);
for (int i=;i<=n;i++)
if (q[i].op==) printf("%d\n",q[i].ans);
return ;
}

BZOJ2716 [Violet]天使玩偶(cdq分治+树状数组)的更多相关文章

  1. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

  2. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  3. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  4. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  5. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  6. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  7. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

  8. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  9. BZOJ1176---[Balkan2007]Mokia (CDQ分治 + 树状数组)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ第一题,warush了好久.. CDQ分治推荐论文: 1 <从<C ...

随机推荐

  1. Android学习之基础知识十六 — Android开发高级技巧的掌握

    一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...

  2. Unity 协程停不了?

    你是不是遇到过协程停不了的情况?你是直接调用IEnumerator方法,如下? void Start () { StartCoroutine(IETest01()); StartCoroutine(I ...

  3. LiveCharts文档-3开始-2基础

    原文:LiveCharts文档-3开始-2基础 LiveCharts文档-3开始-2基础 基本使用 LiveCharts设计的很容易使用,所有的东西都可以自动的实现更新和动画,库会在它觉得有必要更新的 ...

  4. [Oracle]包含了MVIEW的表领域,在进行导出,表领域改名,再导入后,MVIEW会消失不见。

    包含了MVIEW的表领域,在进行导出,表领域改名,再导入后,MVIEW会消失不见. 测试环境12.1.0.2 =================步骤1:数据的准备 [oracle@db12102 ad ...

  5. Verilog对数据进行四舍五入(round)与饱和(saturation)截位

    转自https://www.cnblogs.com/liujinggang/p/10549095.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件 ...

  6. JVM规范系列第1章:引言

    如果你还没下载<Java虚拟机规范>这本书,那么先点击这里下载再一块儿看吧. 前言 Java 虚拟机是一个抽象化的机器,整个规范中提及的 Java 虚拟机都是抽象化的概念,而不是特指 Or ...

  7. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十四节--后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于 ...

  8. MySQL高可用架构-MHA环境部署记录

    一.MHA介绍 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司) ...

  9. require.ensure的用法;异步加载-代码分割;

    webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...

  10. HTTP请求头和响应头部包括的信息有哪些?

    每个HTTP请求和响应都会带有相应的头部信息.默认情况下,在发送XHR请求的同时,还会发送下列头部信息: Accept:浏览器能够处理的内容类型 Accept-Charset:浏览器能够显示的字符集 ...