题目链接
第一眼就是 $KDtree$ 优化建图
然而,空间只有 $128mb$,开不下  
时间不吃紧,考虑直接跑 $Dijkstra$
$Dijkstra$ 中存储的是起点到每个输入时给出的矩阵的最短距离
当取出堆顶时就将这个矩阵中所有点 "裂开",并更新每一个小点的答案
如果该点在之前已经被一个最短路更短的矩阵更新过了,就不扩展它
否则,扩展每一个分裂出的点,将新的矩阵加入优先队列中即可
一个重要的优化就是每次 "分裂" 一个矩阵时要在 $KDtree$ 中将对应节点都删掉,加快下一次查询 
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 2000000
#define inf 100000000
#define lson t[now].ch[0]
#define rson t[now].ch[1]
#define ll long long
using namespace std;  struct Edge {  int t,x1,y1,x2,y2;  Edge(int t=0,int x1=0,int y1=0,int x2=0,int y2=0):t(t),x1(x1),y1(y1),x2(x2),y2(y2){}
};
struct Data {     int ch[2],minv[2],maxv[2],siz,id,p[2];
}t[maxn],arr[maxn];
struct P { int dis,id;  P(int dis=0,int id=0):dis(dis),id(id) {}    bool operator<(P b) const {return b.dis<dis;    }
};
vector<int>G[maxn];
priority_queue<P>Q;
vector<Edge>edges;     int d,cnt,len;
int dis[maxn],answer[maxn],nd[maxn],vis[maxn];
void Min(int &a,int b) { if(b<a) a=b;
}
void Max(int &a,int b) { if(b>a) a=b;
}
bool cmp(Data i,Data j) {  return i.p[d]==j.p[d]?i.p[d^1]<j.p[d^1]:i.p[d]<j.p[d];
}
void pushup(int now) {t[now].minv[0]=t[now].minv[1]=inf,t[now].maxv[0]=t[now].maxv[1]=-inf; for(int i=0;i<2;++i) {if(lson) {Min(t[now].minv[0],t[lson].minv[0]),Min(t[now].minv[1],t[lson].minv[1]),Max(t[now].maxv[0],t[lson].maxv[0]),Max(t[now].maxv[1],t[lson].maxv[1]);   }if(rson) {Min(t[now].minv[0],t[rson].minv[0]),Min(t[now].minv[1],t[rson].minv[1]),Max(t[now].maxv[0],t[rson].maxv[0]),Max(t[now].maxv[1],t[rson].maxv[1]);   }}
}
void build(int l,int r,int &now,int o) {now=++cnt;    if(l==r) {t[now].siz=1, t[now].id=arr[l].id;        t[now].p[0]=t[now].minv[0]=t[now].maxv[0]=arr[l].p[0];  t[now].p[1]=t[now].minv[1]=t[now].maxv[1]=arr[l].p[1];       return;  }int mid=(l+r)>>1;    d=o,nth_element(arr+l,arr+mid,arr+1+r,cmp);      build(l,mid,lson,o^1);         if(r>mid) build(mid+1,r,rson,o^1);       pushup(now),t[now].siz=t[lson].siz+t[rson].siz;
}
void dfs(int now,int x1,int y1,int x2,int y2) {if(t[now].minv[0]>y1||t[now].maxv[0]<x1||t[now].minv[1]>y2||t[now].maxv[1]<x2 || !t[now].siz) return;    if(t[now].id) {  nd[++len]=t[now].id;       t[now].siz=0;            return; }  if(lson) dfs(lson,x1,y1,x2,y2); if(rson) dfs(rson,x1,y1,x2,y2);  t[now].siz=t[lson].siz+t[rson].siz;
}
void debug(int now) {if(!now) return; debug(lson), printf("%d %d %d %d\n",t[now].minv[0],t[now].maxv[0],t[now].minv[1],t[now].maxv[1]),debug(rson);
}
int main(){//   setIO("input");  int n,m,w,h,rt; scanf("%d%d%d%d",&n,&m,&w,&h); for(int i=1;i<=n;++i)  scanf("%d%d",&arr[i].p[0],&arr[i].p[1]),arr[i].id=i;           build(1,n,rt,0);                               for(int i=1;i<=m;++i) {int a,b,c,d,e,f;         scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f), edges.push_back(Edge(b,c,d,e,f)), G[a].push_back(i-1);            }                                                      answer[1]=0,vis[1]=1;                                for(int i=0;i<G[1].size();++i) {int to=G[1][i]; dis[to]=edges[to].t, Q.push(P(edges[to].t, to));         }while(!Q.empty()) { P e=Q.top(); Q.pop();int cn=e.dis;   len=1,dfs(rt, edges[e.id].x1,edges[e.id].y1,edges[e.id].x2,edges[e.id].y2);          for(int i=1;i<=len;++i) {   int cur=nd[i]; if(vis[cur]) continue;  vis[cur]=1, answer[cur]=cn;       for(int j=0;j<G[cur].size();++j) {   int to=G[cur][j];                    dis[to] = cn + edges[to].t;                                           Q.push(P(dis[to], to));            }}} for(int i=2;i<=n;++i) printf("%d\n",answer[i]);     return 0;
}

  

转载于:https://www.cnblogs.com/guangheli/p/11225916.html

luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra相关推荐

  1. 【KD-tree】[NOI2019]弹跳

    题目 题目描述 跳蚤国有 nn 座城市,分别编号为 1 - n1−n,11 号城市为首都.所有城市分布在一个w \times hw×h 范围的网格上.每座城市都有一个整数坐标 (x, y) (1 \l ...

  2. Luogu P5469 [NOI2019]机器人 (DP、多项式)

    不用FFT的多项式(大雾) 题目链接: https://www.luogu.org/problemnew/show/P5469 (这题在洛谷都成绿题了海星) 题解: 首先我们考虑,一个序列位置最右边的 ...

  3. luogu P5468 [NOI2019]回家路线 (斜率优化、DP)

    题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...

  4. [学习笔记] 乱世之神杀疯了 —— K-D tree

    文章目录 K-D tree 建树 合并 插入 删除 查询(估价函数) 旋转坐标系 题目练习 [SDOI2012]最近最远点对 [Violet]天使玩偶/SJY摆棋子 [CQOI2016]K远点对 [国 ...

  5. 洛谷日报 2020年3月前索引

    2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https://www.luo ...

  6. 洛谷日报索引(2020、2019、2018)

    历年洛谷日报索引 2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https: ...

  7. [转载]洛谷日报索引

    2019年 6月 #183[朝田诗乃]你以为莫队只能离线?莫队的在线化改造 https://shoko.blog.luogu.org/moqueue #182[Heartlessly ]常用距离算法详 ...

  8. p4779 单源最短路径(标准版)-java版

    传送门: P4779 [模板]单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4779 先给 ...

  9. 【NOI2019】弹跳【二维线段树】【dijkstra】

    题意:一个w×hw\times hw×h的二维平面上有nnn个城市,有mmm个弹跳装置,第iii个可以花费tit_iti​的时间从城市pip_ipi​跳到矩形x∈[l,r],y∈[u,d]x\in [ ...

最新文章

  1. DirectSound的应用
  2. office 2007打字慢问题
  3. android 跳转到小米手机神隐模式
  4. 技术 KPI 的量化
  5. LeetCode之Count and Say
  6. HC-05蓝牙模块的配置和使用方法
  7. Windows 8.1 升级到专业版
  8. turtlebot rviz错误rviz error no transporm from base to map
  9. .Net读取Excel(包括Excel2007)
  10. 【MDVRP】基于matlab水滴算法求解多仓库车辆路径规划问题【含Matlab源码 1310期】
  11. 【预测模型】基于粒子群算法优化DBN深度置信网络实现数据预测matlab代码
  12. wps页眉偶数页不同怎么设置_WPS文字应技巧—如何使奇数和偶数页的页眉页脚不同...
  13. vscode 保存时自动格式化遇到的坑
  14. 梦三国解析服务器spl文件头失败怎么解决,梦三国 卡顿问题的解决方法
  15. JavaScript格式化输出时间
  16. momentjs 常用总结
  17. SQLSERVER2008 18456错误
  18. AtCoder Beginner Contest 214(补题)
  19. 苏宁零售云,“动物凶猛”
  20. 计算机中常用于比较的图表有,2013年职称计算机Excel考点:常用图表类型

热门文章

  1. wordpress 分类使用不同的模版
  2. Python通过future处理并发
  3. 在AWS中部署OpenShift平台
  4. 改变按钮在iPhone下的默认风格
  5. 基于51单片机实现模拟IIC总线时序
  6. 引用 vsftpd配置手册(实用)
  7. GridView导出Excel研究
  8. 数据结构之——队列与循环队列
  9. MongoDB之compact操作详解
  10. HTML介绍及简单模式