Problem Link

给定平面上 \(n\) 个点,\(Q\) 次询问编号在 \([l,r]\) 内的点的最近点对。\(n,Q\le 2.5\times 10^5\)。


技巧:平面网格化

乱搞都是错的。看见欧几里德距离,想到平面网格化。

考虑一个平面最近点对的网格化做法:随机点的顺序,按顺序依次考虑,考虑到第 \(i\) 个点时,设当前最近点对距离为 \(d\),则把平面划分为 \(d\times d\) 的网格,直接枚举 \(i\) 所在周围 \(9\) 个格子中 \(O(1)\) 个点即可。时间复杂度 \(\sum i\times O(1/i)=O(n)\),但这不是重点。重点在于网格化。

现在 \(d\) 不能确定,于是令 \(d\) 为一个定值,然后将平面划分 \(\log_d V\) 次,每次划分为 \(d^k\times d^k\) 的网格。同理每个网格中需要保留的点距离均大于 \(d^{k-1}\),所以总点数应该是 \(O(d)\) 的。几倍常数不知道。

扫右端点 \(r\),对每个点 \(i\) 维护在 \(j>i\) 的 \(j\) 中 \(\mathrm{dis}(i,j)\) 的最小值,那询问就查 \(l\) 后缀最小值即可。扫到点 \(r\) 的时候,对每一层,暴力更新周围 \(3\times 3\) 的网格,更新权值,同时把没用的点扬掉。

一共会进行 \(O(n\log_d V)\) 次单点修改,但每次修改常数巨大巨大。有 \(O(Q)\) 次查询。拿个分块数组维护即可做到 \(O(n\log_d V+Q\sqrt{n})\)。

\(d\) 开成 \(4\),位运算,好写,又快。\(d=2\) 时间空间都开不下。

点击查看代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin);
#define Fout(file) freopen(file,"w",stdout);
using namespace std;
const int N=2.5e5+5,M=1.5e7,V=1e8; using ll = long long;
class STree{;
int n,B; ll a[N],b[N];
public:
void init(int nn) { n=nn; B=sqrt(n)+1; For(i,0,n) a[i]=b[i]=1e18; }
void poke(int x,ll y) { a[x]=min(a[x],y); b[x/B]=min(b[x/B],y); }
ll peek(int x) { return min(*min_element(a+x,a+min(n,x/B*B+B-1)+1),*min_element(b+x/B+1,b+n/B+1)); }
//~ ll peek(int x) { ll res=1e18; For(i,x,min(n,x/B*B+B-1)) res=min(res,a[i]);; For(i,x/B+1,n/B) res=min(res,b[i]);; return res; }
}T;
int n,Q,X[N],Y[N],tot; vector<pair<int,int>> qry[N]; vector<int> lis[M]; ll ans[N];
__gnu_pbds::gp_hash_table<ll,int> mp[30];
//~ unordered_map<ll,int> mp[30];
ll dist(int i,int j) { return 1ll*(X[i]-X[j])*(X[i]-X[j])+1ll*(Y[i]-Y[j])*(Y[i]-Y[j]); }
ll ID(int x,int y) { return (ll(x)*10*V)+y; }
int Cnt=0;
void update(int u,ll id,int i,bool flg){
if(!flg&&mp[i].find(id)==mp[i].end()) return;
if(mp[i].find(id)==mp[i].end()) mp[i][id]=++tot,assert(tot<M);
int o=mp[i][id]; vector<int> tmp; if(flg) tmp.push_back(u);
for(int v:lis[o]){
Cnt++;
ll d=dist(u,v); T.poke(v,d); if(d>(i==0?0:1ll<<(i*4-4))) tmp.push_back(v);
}
swap(lis[o],tmp);
}
int main(){
//~ Fin("hh.in"); Fout("hh.out");
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>Q; T.init(n); For(i,1,n) cin>>X[i]>>Y[i];
For(i,1,Q) { int l,r; cin>>l>>r; qry[r].emplace_back(l,i); ans[i]=1e18; }
For(r,1,n){
for(int i=0;(1<<(i*2))<=V;i++){
int x=X[r]>>(i*2),y=Y[r]>>(i*2);
For(xx,x-1,x+1) For(yy,y-1,y+1){
if(xx<0||yy<0||xx>(V>>(i*2))||yy>(V>>(i*2))) continue;
update(r,ID(xx,yy),i,xx==x&&yy==y);
}
}
for(auto [l,id]:qry[r]) ans[id]=min(ans[id],T.peek(l));
}
For(i,1,Q) cout<<ans[i]<<'\n';
return 0;
}

【DS】P9062 [Ynoi2002] Adaptive Hsearch&Lsearch(区间最近点对)的更多相关文章

  1. HDU - 4553 约会安排(区间合并)

    https://cn.vjudge.net/problem/HDU-4553 Description 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的 ...

  2. HDU 4553 约会安排 (区间合并)【线段树】

    <题目链接> 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有 ...

  3. JS------获取一个时间区间的所有天

    1:获取一个时间区间的所有日期 function getDiffDate(start, end) { var startTime = getDate(start); var endTime = get ...

  4. 随机森林(Random Forest),决策树,bagging, boosting(Adaptive Boosting,GBDT)

    http://www.cnblogs.com/maybe2030/p/4585705.html 阅读目录 1 什么是随机森林? 2 随机森林的特点 3 随机森林的相关基础知识 4 随机森林的生成 5 ...

  5. 约会安排---hdu4553(线段树,麻烦的区间覆盖)

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意, ...

  6. HDU 4553 约会安排(线段树区间合并+双重标记)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 题目大意:就是有三种操作: ①DS x,安排一段长度为x的空闲时间跟屌丝一起,输出这段时间的起点 ...

  7. d-s证据理论

    证据理论是Dempster于1967年首先提出,由他的学生Shafer于1976年进一步发展起来的一种不精确推理理论,也称为Dempster/Shafer 证据理论(D-S证据理论),属于人工智能范畴 ...

  8. HDU5381【莫队算法+区间GCD特性】

    前言: 主要最近在刷莫队的题,这题GCD的特性让我对莫队的使用也有了新的想法.给福利:神犇的一套莫队算法题 先撇开题目,光说裸的一个莫队算法,主要的复杂度就是n*sqrt(n)对吧,这里我忽略了一个左 ...

  9. 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)

    题目: 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑, ...

  10. [NLP] Adaptive Softmax

    1. Overview Adaptive softmax算法在链接1中的论文中提出,该算法目的是为了提高softmax函数的运算效率,适用于一些具有非常大词汇量的神经网络. 在NLP的大部分任务中,都 ...

随机推荐

  1. AI论文解读丨融合视觉、语义、关系多模态信息的文档版面分析架构VSR

    摘要:文档版式分析任务中,文档的视觉信息.文本信息.各版式部件间的关系信息都对分析过程具有很重要的作用.本文提出一种融合视觉.文本.关系多模态信息的版式分析架构VSR. 本文分享自华为云社区<论 ...

  2. 云图说|图解DGC:基于华为智能数据湖解决方案的一体化数据治理平台

    摘要:数据湖治理中心DGC,帮助企业快速构建从数据集成到数据服务的端到端智能数据系统,消除数据孤岛,统一数据标准,加快数据变现,实现数字化转型. 本文分享自华为云社区<[云图说]第232期 图解 ...

  3. 抖音APP如何实现用户生命周期提升

    > 更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,在火山引擎数智平台在北京举办的"超话数据:企业产品优化分享"的活动上,抖音策略 ...

  4. ThreadPoolExecutor 介绍

    线程池能够带来3个好处: 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗:提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行:提高线程的可管理性:线程是稀缺资源,如 ...

  5. NOKOV度量光学动作捕捉系统工作流程

    如果你对影视.动画或者游戏有一定关注,相信你一定听说过"动作捕捉".事实上,无论是屏幕中的战场,还是真实的军事领域,从2K游戏中的虚拟球员,到医疗.康复.运动领域的专业研究:从机器 ...

  6. 汇编 | CPU物理地址本质理解

    物理地址 我们知道,CPU访问内存单元时,要给出内存单元的地址.所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址. CPU通 ...

  7. 5.0 数据库完整性详解(PRIMARY KEY、REFERENCES、CHECK、CONSTRAINT、DOMAIN、TRIGGER)

    前言 本篇文章学习书籍:<数据库系统概论>第5版 王珊 萨师煊编著 视频资源来自:数据库系统概论完整版(基础篇+高级篇+新技术篇) 由于 BitHachi 学长已经系统的整理过本书了,我在 ...

  8. Codeforces Round #725 (Div. 3) A~G 题解记录

    补题链接:Here 1538A. Stone Game 数组 \(a\) 的大小为 \(n\) ,请问每次可以删除最左和最右侧的元素,请问最少执行多少次能删除掉数组中的最大值和最小值 (\(1\le ...

  9. 2014年第五届蓝桥杯【C++省赛B组】

    第一题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提 ...

  10. AtCoder | ABC 125 Person Editorial

    开始补AtCoder的数学题了,练下思维 AB两道都很简单,看懂题就OK. C,D稍微麻烦一些 Problem C: GCD On Blackboard 为了解决此问题,我们需要了解最大公约数(GCD ...