题目传送门

题目大意: 有一张图,每条边有海拔和长度两个属性,多组询问,每次给出 x,hx,hx,h 表示海拔 ≤h\leq h≤h 的边都会积水,然后要从 xxx 开车出发,不能经过积水的边,然后开车到某个点后再徒步走到点 111,要求徒步距离尽可能小,求出最小的徒步距离。

题解

转化一下,就是每次从 xxx 出发,只能走海拔大于 hhh 的边,然后问能走到的点里面离点 111 最近的那个到点 111 的距离是多少。

显然先跑一发最短路,求出每个点到 111 的距离,然后造出 KruskalKruskalKruskal 重构树之后求出一下子树内距离最小值,然后每次询问跑一下倍增就能得到答案了。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 400010
#define MS(f,x) memset(f,x,sizeof(f))int T,n,m,Q,k,S;
struct edge{int x,y,z,h,next;}e[maxn<<1];
int first[maxn],len=0;
void buildroad(int x,int y,int z,int h){e[++len]=(edge){x,y,z,h,first[x]};first[x]=len;}
int dis[maxn],v[maxn];
struct heap{int dui[maxn],t;heap():t(0){}void up(int x){while(x>1&&dis[dui[x]]<dis[dui[x/2]])swap(dui[x],dui[x/2]),x>>=1;}void down(int x){if(x>t/2)return;int re=x;if(dis[dui[x]]>dis[dui[x*2]])re=x*2;if(x*2+1<=t&&dis[dui[re]]>dis[dui[x*2+1]])re=x*2+1;if(re!=x)swap(dui[re],dui[x]),down(re);}void add(int x){dui[++t]=x;up(t);}bool empty(){return !t;}int top(){return dui[1];}void pop(){dui[1]=dui[t--];down(1);}
}dui;
void dij()
{MS(dis,127);dis[1]=0;dui.add(1);v[1]=1;while(!dui.empty()){int x=dui.top();dui.pop();v[x]=0;for(int i=first[x];i;i=e[i].next)if(dis[e[i].y]>dis[x]+e[i].z){dis[e[i].y]=dis[x]+e[i].z;if(!v[e[i].y])v[e[i].y]=1,dui.add(e[i].y);}}
}
bool cmp(edge x,edge y){return x.h>y.h;}
int f[maxn][20],val[maxn],fa[maxn],Z[maxn],Y[maxn];
int findfa(int x){return x==fa[x]?x:fa[x]=findfa(fa[x]);}
void buildtree()
{sort(e+1,e+len+1,cmp);MS(f,0);MS(val,0);MS(Z,0);MS(Y,0);for(int i=1;i<=2*n;i++)fa[i]=i;for(int i=1;i<=len;i++){int x=findfa(e[i].x),y=findfa(e[i].y);if(x!=y)f[x][0]=f[y][0]=fa[y]=fa[x]=++n,val[n]=e[i].h,Z[n]=x,Y[n]=y;}for(int j=1;j<=19;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
}
int id[maxn],con[maxn],tot=0,st[maxn][20];
void dfs(int x,int fa)
{id[x]=++tot;st[id[x]][0]=dis[x];if(Z[x])dfs(Z[x],x),dfs(Y[x],x); con[x]=tot;
}int main()
{scanf("%d",&T);while(T--){scanf("%d %d",&n,&m);int N=n; MS(first,0),len=0;for(int i=1,x,y,z,h;i<=m;i++)scanf("%d %d %d %d",&x,&y,&z,&h),buildroad(x,y,z,h),buildroad(y,x,z,h); dij(); buildtree(); tot=0;dfs(n,0);for(int j=1;j<=19;j++)for(int i=1;i<=n;i++)st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);scanf("%d %d %d",&Q,&k,&S);int last_ans=0;while(Q--){int x,h;scanf("%d %d",&x,&h);x=(x+k*last_ans-1)%N+1;h=(h+k*last_ans)%(S+1);for(int i=19;i>=0;i--)if(f[x][i]&&val[f[x][i]]>h)x=f[x][i];int lg=log2(con[x]-id[x]+1);printf("%d\n",last_ans=min(st[id[x]][lg],st[con[x]-(1<<lg)+1][lg]));}}
}

NOI 2018 归程 题解相关推荐

  1. NOI 2018 归程 (Kruskal重构树)

    题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...

  2. NOI 2018 简要题解

    D1T1 洛谷题目传送门 题目描述 给定一个n个点m条边的无向图,每条边有高度和长度,Q次询问,每次给定起点,以及限制高度,求从起点能通过高度大于限制高度的边到达的点中,到1号点最短路的最小值 强制在 ...

  3. 第 35 届信息学奥林匹克竞赛(NOI 2018)二试赛题

    第 35 届信息学奥林匹克竞赛(NOI 2018)二试赛题 第35届信息学奥林匹克竞赛(NOI2018)在长沙雅礼中学顺利举行.

  4. 信息学计算机奥林匹克竞赛题,第35 届信息学奥林匹克竞赛(NOI 2018)二试赛题

    第35届信息学奥林匹克竞赛(NOI2018)由CCF主办.长沙市雅礼中学承办,于7月16日- 22日在湖南省长沙市雅礼洋湖实验中学举行.7月16日为报到日,7月22日为疏散日.来自31个省.市的新一代 ...

  5. 【NOI 2018】归程(Kruskal重构树)

    题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...

  6. NOIp 2018 游记+题解

    写在前面 这篇游记被某文科巨佬喷为小学生日记,大家将就看下吧别较真-- 关于我 HB无名小蒟蒻zar. 来自WFLS,高一,老年女选手. 在各大oj上以 渣儿 / juruoZAR / ouaoan ...

  7. noi 2017 简要题解

    回顾noi 2017 DAY1 整数 压位维护序列.用线段树维护一段0后第一个1,一段A-1后第一个<(A - 1)的数 推推转移式子即可 代码犯了无数个错误,并且检查的时候没有仔细的检查出来, ...

  8. NOI 2021 游记题解总结

    文章目录 Travel Notes Day 0 Day 1 Day 3 Day 3.5 Day 10 Solutions D1T1 D1T2 算法一 算法二 Lemma D1T3 算法一 算法二 算法 ...

  9. BUUCTF__[网鼎杯 2018]Fakebook_题解

    前言 前天上午去报名了初中辅导老师,下午收到暑假可能可以回学校学习...真就尴尬.如果可以,回还是不回. 参加了2020年的网鼎杯,签到杯,神仙打架,萌新不配参加,下次一定. 读题 这题有点意思,虽然 ...

最新文章

  1. 代理模式(为对象提供相同的接口)
  2. 200910阶段一C++虚析构
  3. mysql 多级分类_数据库多级分类相关行排列在一起的查询
  4. iOS下载大文件原理解析一
  5. Mr.J--初识Ajax
  6. 黑客瞄准美国 ATM 机,疯狂窃取超百万美元资金
  7. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第4节 模拟BS服务器案例_2_模拟BS服务器代码实现...
  8. ES6学习笔记对象的扩展(补充)
  9. Delphi 安卓11 中文语音合成(中文朗读)注意内容
  10. 计算机科学美国大学专业,最新!2019年USNews美国大学计算机专业排名
  11. (2019)基于传感器融合的机会主义占用计数估计:一个案例研究
  12. 计算机机房灭火器种类,常见灭火器的种类、适用范围以及使用方法
  13. skynet mysql 携程_有哪些小型后台服务端开源项目?
  14. Git 每次提交都需要输入密码
  15. P2P技术软件Murder分发大文件
  16. 苹果Mac电脑开机启动时的声音如何关闭?
  17. 机器学习案例丨基于广泛和深入的推荐 - 餐厅评级预测
  18. EC200 EC600 EC20接入工业互联网云平台
  19. 线性代数笔记31——奇异值分解
  20. Wait延时及定时查询

热门文章

  1. CICS通讯java应用调用服务的CTG Client配置
  2. 神经网络模型训练简记(一)
  3. Unity之IK(反向动力学)
  4. JavaScript 滑动验证
  5. 全网最详细华为OSPF常用配置,网工必看!
  6. linux下C语言my_memcopy和my_strcpy实现
  7. window 沙盒讲解
  8. 机器学习-- > 隐马尔科夫模型(HMM)
  9. 【愚公系列】2023年06月 网络安全(交通银行杯)-word弱口令2
  10. 【C++进阶】哈希(万字详解)—— 运用篇(下)