bzoj 2716 天使玩偶(CDQ分治,BIT)
【题目链接】
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=29234
【题意】
询问当前点与已知点的最小曼哈顿距离。
【思路】
CDQ分治
Dist(A,B)=|A.x-B.x|+|A.y-B.y|。假设B处于A点的左下方,则有dist=(A.x+A.y)-(B.x+B.y),然后发现这个就与刚做过的 Mokia 比较相似,只不过是求和变成了求取最大罢了,依然可以对x用cdq分治使升序,对y用树状数组维护统计。
再考虑其它的相对位置就行了。这里有个好(qi)的(ji)方(yin)法(qiao),就是通过把a变成mx-a+1来改变符号的方向,所以只需要写一个处理其中一种情况的函数就可以套用于其他情况了。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std; const int N = 1e6+;
const int inf = 1e9+; void read(int& x)
{
char c=getchar(); x=; int f=;
while(!isdigit(c)){if(c=='-')f=-; c=getchar();}
while(isdigit(c)) x=x*+c-'',c=getchar();
x*=f;
} int n,m,mx,sz,T,C[N],flag[N]; struct Node {
int t,x,y,pos,ans;
bool operator < (const Node& rhs) const{
return x<rhs.x;
}
Node(int t=,int x=,int y=) {
this->t=t,this->x=x,this->y=y;
pos=sz; ans=inf;
}
}q[N],t[N];
bool cmp(const Node& x,const Node& y)
{
return x.pos<y.pos;
} void upd(int x,int v)
{
for(;x<=mx;x+=x&-x) {
if(flag[x]!=T) flag[x]=T,C[x]=v;
else C[x]=max(C[x],v);
}
}
int query(int x)
{
int res=;
for(;x;x-=x&-x) {
if(flag[x]==T) res=max(res,C[x]);
}
return res;
} void solve(int l,int r)
{
if(l==r) return ;
int mid=(l+r)>>;
int l1=l,l2=mid+,i,j;
for(i=l;i<=r;i++) {
if(q[i].pos<=mid) t[l1++]=q[i];
else t[l2++]=q[i];
}
memcpy(q+l,t+l,sizeof(Node)*(r-l+));
solve(l,mid);
j=l; T++;
for(i=mid+;i<=r;i++) if(q[i].t==) {
for(;j<=mid&&q[j].x<=q[i].x;j++)
if(q[j].t==) upd(q[j].y,q[j].y+q[j].x);
int tmp=query(q[i].y);
if(tmp) q[i].ans=min(q[i].ans,q[i].x+q[i].y-tmp);
}
solve(mid+,r);
l1=l,l2=mid+; int now=l;
while(l1<=mid||l2<=r) {
if(l2>r||l1<=mid&&q[l1]<q[l2]) t[now++]=q[l1++];
else t[now++]=q[l2++];
}
memcpy(q+l,t+l,sizeof(Node)*(r-l+));
} int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout);
read(n),read(m);
int t,x,y;
FOR(i,,n) {
read(x),read(y);
q[++sz]=Node(,x,y);
mx=max(mx,y);
}
FOR(i,,m) {
read(t),read(x),read(y);
q[++sz]=Node(t,x,y);
mx=max(mx,y);
}
sort(q+,q+sz+);
solve(,sz);
FOR(i,,sz) q[i].x=mx-q[i].x+;
sort(q+,q+sz+);
solve(,sz);
FOR(i,,sz) q[i].y=mx-q[i].y+;
sort(q+,q+sz+);
solve(,sz);
FOR(i,,sz) q[i].x=mx-q[i].x+;
sort(q+,q+sz+);
solve(,sz);
sort(q+,q+sz+,cmp);
FOR(i,n+,sz) if(q[i].t==)
printf("%d\n",q[i].ans);
return ;
}
Ps:手残毁一生 <_<
bzoj 2716 天使玩偶(CDQ分治,BIT)的更多相关文章
- [bzoj] 2716 天使玩偶 || CDQ分治
原题 已知n个点有天使玩偶,有m次操作: 操作1:想起来某个位置有一个天使玩偶 操作2:询问离当前点最近的天使玩偶的曼哈顿距离 显然的CDQ问题,三维分别为时间,x轴,y轴. 但是这道题的问题在于最近 ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- BZOJ 2716 Violet 3 天使玩偶 CDQ分治
题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...
- BZOJ.2716.[Violet3]天使玩偶(CDQ分治 坐标变换)
题目链接 考虑对于两个点a,b,距离为|x[a]-x[b]|+|y[a]-y[b]|,如果a在b的右上,那我们可以把绝对值去掉,即x[a]+y[a]-(x[b]+y[b]). 即我们要求满足x[b]& ...
- bzoj 2716 天使玩偶 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 果然和 bzoj 2648 是一样的吧: 只是数组要迷之开大,3e5+5 会RE? 代 ...
- 洛谷P4169 天使玩偶 CDQ分治
还是照着CDQ的思路来. 但是有一些改动: 要求4个方向的,但是可爱的CDQ分治只能求在自己一个角落方向上的.怎么办?旋转!做4次就好了. 统计的不是和,而是——max!理由如下: 设当前点是(x,y ...
- CH 4701 - 天使玩偶 - [CDQ分治]
题目链接:传送门 关于CDQ分治(参考李煜东<算法竞赛进阶指南>): 对于一系列操作,其中的任何一个询问操作,其结果必然等价于:初始值 + 此前所有的修改操作产生的影响. 假设共有 $m$ ...
随机推荐
- tomcat 配置虚拟路径
把图片或者其他的文件传到webapps以外的目录 <Context docBase= "e:\image\" path= "/uploads" rel ...
- [machine learning] Loss Function view
[machine learning] Loss Function view 有关Loss Function(LF),只想说,终于写了 一.Loss Function 什么是Loss Function? ...
- MCM试题原文及翻译 AB题 2014美国数学建模竞赛
MCM试题原文及翻译 AB题 2014美国数学建模竞赛 原创翻译,如有瑕疵,敬请谅解. 转载请注明:过客小站 » MCM试题原文及翻译 AB题 2014美国数学建模竞赛 PROBLEM A: The ...
- jsp 获取表单值, 提交类型为multipart/form-data处理
//tt.jsp<script type="text/javascript"> function doSubmit(){ alert("aaaaaa" ...
- Mac中编译安装Qt 4.4
解压下载到的.gz源码:gunzip xxx.tar.gztar xvf xxx.tar, 其实在Mac中可以直接双击解压的.然后定位到解压后的目录下:./configuremakesudo make ...
- SVN使用方法总结
SVN使用方法 SVN版本管理模式:http://www.cnblogs.com/newstar/archive/2011/01/04/svn.html (集中式-trunk和分散式-branch ...
- 统计学习方法笔记--EM算法--三硬币例子补充
本文,意在说明<统计学习方法>第九章EM算法的三硬币例子,公式(9.5-9.6如何而来) 下面是(公式9.5-9.8)的说明, 本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流 ...
- Ubuntu 安装Android Studio与使用手册
用的是Ubuntu 12.04 1.先去下载,国内可以去这里下载 https://github.com/inferjay/AndroidDevTools 2.下载后解压进入android-studio ...
- Android开发之 android:windowSoftInputMode属性详解
android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...
- 使用Spring框架的12个开源项目
使用Spring框架的12个开源项目 http://www.csdn.net/article/2013-10-14/2817176-open-source-projects-that-use-spri ...