bzoj2716: [Violet 3]天使玩偶
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 1000005
#define maxk 1000005
using namespace std; int n,m,ans[maxn],sum[maxk],maxx,maxy;
const int inf=maxk*;
struct date{
int op,x,y,id;
}list[maxn],a[maxn]; bool comp(date x,date y){
return x.x<y.x;
} int lowbit(int x){
return x&(-x);
} void add(int x,int y){
for (int i=x;i<=maxy;i+=lowbit(i)){
sum[i]=max(sum[i],y);
}
} int query(int x){
int temp=;
for (int i=x;i>;i-=lowbit(i)){
temp=max(temp,sum[i]);
}
if (!temp) return -inf;
return temp;
} void cdq_solve(int l,int r){
if (l==r) return;
int mid=(l+r)/;
cdq_solve(l,mid),cdq_solve(mid+,r);
sort(a+l,a+mid+,comp),sort(a+mid+,a+r+,comp);
int temp=;
for (int i=l,j=mid+;j<=r;){
for (;a[i].op==&&i<=mid;i++);
for (;a[j].op==&&j<=r;j++);
if (i<=mid&&a[i].x<=a[j].x) temp=i,add(a[i].y,a[i].x+a[i].y),i++;
else if (j<=r) ans[a[j].id]=min(ans[a[j].id],a[j].x+a[j].y-query(a[j].y)),j++;
}
for (int i=l;i<=temp;i++) if (a[i].op==){
for (int j=a[i].y;j<=maxy;j+=lowbit(j)) sum[j]=;
}
} void read(int &x){
x=;int f=;char ch;
for (ch=getchar();ch>''||ch<'';ch=getchar()) if (ch=='-') f=-;
for (;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
x*=f;
} int main(){
int op,x,y;
read(n),read(m);
maxx=maxy=,memset(sum,,sizeof(sum));
for (int i=;i<=n+m;i++) ans[i]=inf;
for (int i=;i<=n;i++){
read(x),read(y);
maxx=max(maxx,x),maxy=max(maxy,y);
list[i].op=,list[i].x=x,list[i].y=y;
}
for (int i=n+;i<=n+m;i++){
read(op),read(x),read(y);
list[i].op=op,list[i].x=x,list[i].y=y,list[i].id=i;
maxx=max(maxx,x),maxy=max(maxy,y);
}
maxx++,maxy++;
n+=m;
for (int i=;i<=n;i++) a[i]=list[i];
cdq_solve(,n);
for (int i=;i<=n;i++) a[i]=list[i],a[i].x=maxx-a[i].x;
cdq_solve(,n);
for (int i=;i<=n;i++) a[i]=list[i],a[i].y=maxy-a[i].y;
cdq_solve(,n);
for (int i=;i<=n;i++) a[i]=list[i],a[i].x=maxx-a[i].x,a[i].y=maxy-a[i].y;
cdq_solve(,n);
for (int i=;i<=n;i++) if (list[i].op==) printf("%d\n",ans[i]);
return ;
}
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2716
题意:初始时给定平面内n个点的坐标,构成一个点集,以及m个操作,每个操作为一下两种之一:
1.在该点集中加入一个新点;
2.给定一个点的坐标,询问该点集中的点到该点的曼哈顿距离最小值。
做法:第一种做法是裸上k-d tree,现在我还不会写……;
第二种做法是cdq分治+排序+树状数组(+读入优化,因为我有几个同学被卡常了,有没有觉得特别坑-.-),cdq分治的关键就在于如何高效地用第一个区间的修改来更新第二个区间的询问。首先,我们把初始的n个点也当成修改操作,对于一个询问,影响它的修改操作可能在它的左上,右上,左下,右下,我们在这里只考虑左下的情况(因为其他三种用maxx,maxy搞一搞就可以搞到左下方来,这样做并不影响相对距离,即不影响答案),那如何处理修改在询问左下方的情况呢?
我的方法比较辣鸡qaq,跑了75s,rank1可是10s不到啊,捂脸>.<;
对于修改都在左下方了,dist=x-X+y-Y,(x,y)为询问的点的坐标,(X,Y)为修改的点的坐标,式子可化简为dist=(x+y)-(X+Y),(x+y)确定,我们需要统计的就是位于其左下方的点中,横纵坐标之和最大的,这里我们将两个区间中的点分别按x坐标升序排序,在树状数组中更新答案,及时更新询问的答案即可。过程中用两个指针维护即可。
为什么要转化到左下方呢?因为方便插入,和查询,树状数组只能支持查询前缀最大(小)值。
cdq分治+树状数组+排序
bzoj2716: [Violet 3]天使玩偶的更多相关文章
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*
bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...
- 【kd-tree】bzoj2716 [Violet 3]天使玩偶
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】
题目 输入格式 输出格式 输入样例 //样例太长就不贴了.... 输出样例 //见原题 提示 题解 我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案. 为了使所有点都对答案进行 ...
- BZOJ2716: [Violet 3]天使玩偶(KD-Tree)
Description Input Output Sample Input 100 100 81 23 27 16 52 58 44 24 25 95 34 2 96 25 8 14 97 50 97 ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- BZOJ 2716: [Violet 3]天使玩偶
2716: [Violet 3]天使玩偶 Time Limit: 80 Sec Memory Limit: 128 MBSubmit: 1473 Solved: 621[Submit][Statu ...
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
随机推荐
- switch2osm使用open street map离线地图中文乱码方框解决办法
----------written by shenwenkai------------- ubuntu linux环境下,按照网址(https://switch2osm.org/serving-til ...
- 如何把Json格式字符写进text文件中
本篇一步一步学习怎样把显示于网页的json格式的字符串写进text文件中,并保存起来.学习到创建model, Entity, 序列化List<object>转换为json,显示于网页上.然 ...
- 硬盘安装win2003
1.将安装文件放到D盘或E盘,自己指定 2.用U盘或者光盘启动,进入DOS或WINPE吧,转到刚才指定的目录下,运行 winnt32 /syspart:c/marklocalsource/tempdr ...
- AI: Jarvis
AI: Jarvis 扎克伯格本周二在facebook发布了一篇文章,介绍自己利用个人时间开发的一套在自己家里使用的AI系统,并将它命名为Jarvis,对!就是电影钢铁侠里的AI助手Jarvis. ...
- Visual Studio2012打开时弹出“遇到异常:这可能是由某个扩展导致的”错误的解决办法
Visual Studio2012打开时弹出"遇到异常:这可能是由某个扩展导致的"错误的解决办法: 具体问题如下: 分析原因:网上搜集了以下,出现异常的原因是安装了第三方控件,然后 ...
- lecture7-序列模型及递归神经网络RNN
Hinton 第七课 .这里先说下RNN有recurrent neural network 和 recursive neural network两种,是不一样的,前者指的是一种人工神经网络,后者指的是 ...
- Ajax与json在前后端中的细节解惑
ajax请求JSON Thinkphp中对是否为Ajax的判断,在TP3.2开发手册中有这么一段:“需要注意的是,如果使用的是ThinkAjax或者自己写的Ajax类库的话,需要在表单里面添加一个隐藏 ...
- PHP 依赖注入,从此不再考虑加载顺序
说这个话题之前先讲一个比较高端的思想--'依赖倒置原则' "依赖倒置是一种软件设计思想,在传统软件中,上层代码依赖于下层代码,当下层代码有所改动时,上层代码也要相应进行改动,因此维护成本较高 ...
- [poj 3537]Crosses and Crosses(博弈论)
题目:http://poj.org/problem?id=3537 题意:给你n个格子,两个人依次在n个格子的任意空位置画"X",谁如果画了一个后,3个X连在了一起,那么那个人就获 ...
- java代码注释规范
java代码注释规范 代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率.也是程序代码可维护性的重要环节之一.所以我们不是为写注释而写注释.下面说一下我们在诉求网二 ...