题目大意

\(n\)(\(n\leq2*10^5\))个点,\(m\)(\(m\leq4*10^5\))条边的图,每条边有海拔\(a_i(a_i\leq10^9)\)、长度\(l_i(l_i\leq10^4)\),定义两点\(a,b\)距离为从\(a\)走到\(b\)至少要走的长度之和

\(q\)组询问,强制在线,每次给出\(v,p\),表示询问不走\(a_i\leq p\)的边,从\(v\)出发能走到的与\(1\)号点距离最近的点到\(1\)号点的距离

题解

预处理每个点到\(1\)号点的距离

每次询问相当于在问删掉所有\(a_i\leq p\)的边,点\(v\)所在连通块中到\(1\)号点最小的距离

发现只考虑原图的最大生成树上的边,不会改变连通性

点\(v\)所在连通块之所以到不了别的点集,是因为它们之间在最大生成树上的路径中有一条边\(a_i\leq p\)

考虑kruskal的过程,相当于有一次是用一条\(a_i\leq p\)的边合并了点\(v\)所在连通块与其他点集

这样就可以以这种方法建一新棵树:一开始有\(n\)个点,没有边,kruskal中每合并两个点集,就新建一个表示当前边的点,并且将两个点集新树中的根变成新建点的儿子

新树中一个点的子树表示这个点对应的原图的最大生成树中一条边kruskal时合并的两个点集,也就是说,这个子树中任意两点的路径中不会出现边权小于该边的边

所以每次询问在新树中找\(v\)的深度最小的\(a_i> p\)的祖先

这个新树也叫kruskal重构树

代码
  1. #include<algorithm>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<ctime>
  7. #include<iomanip>
  8. #include<iostream>
  9. #include<map>
  10. #include<queue>
  11. #include<set>
  12. #include<stack>
  13. #include<vector>
  14. #define rep(i,x,y) for(register int i=(x);i<=(y);++i)
  15. #define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
  16. #define view(u,k) for(int k=fir[u];~k;k=nxt[k])
  17. #define maxn 200010
  18. #define maxm 800010
  19. #define pii pair<int,int>
  20. #define fi first
  21. #define se second
  22. #define mp make_pair
  23. #define LL long long
  24. using namespace std;
  25. int read()
  26. {
  27. int x=0,f=1;char ch=getchar();
  28. while(!isdigit(ch)&&ch!='-')ch=getchar();
  29. if(ch=='-')f=-1,ch=getchar();
  30. while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  31. return x*f;
  32. }
  33. void write(int x)
  34. {
  35. if(x==0){putchar('0'),putchar('\n');return;}
  36. int f=0;char ch[20];
  37. if(x<0)putchar('-'),x=-x;
  38. while(x)ch[++f]=x%10+'0',x/=10;
  39. while(f)putchar(ch[f--]);
  40. putchar('\n');
  41. return;
  42. }
  43. int t,n,m,fir[maxn],nxt[maxm],v[maxm],w[maxm],fa[maxn],anc[maxn<<1][20],val[maxn<<1],mind[maxn<<1],ans;
  44. int cnte,cntnd,dis[maxn],vis[maxn],q,k,s;
  45. struct edge{int u,v,w;}e[maxm>>1];
  46. void ade(int u1,int v1,int w1){v[cnte]=v1,w[cnte]=w1,nxt[cnte]=fir[u1],fir[u1]=cnte++;}
  47. priority_queue<pii >Q;
  48. bool cmp(edge x,edge y){return x.w>y.w;}
  49. void reset()
  50. {
  51. rep(i,1,n)fa[i]=-i,fir[i]=-1,dis[i]=2147483647,vis[i]=0;
  52. rep(i,1,(n<<1)){val[i]=0,mind[i]=2147483647;rep(j,0,19)anc[i][j]=0;}ans=0;
  53. cnte=0,cntnd=n;
  54. }
  55. int f(int x){return fa[x]<0?x:fa[x]=f(fa[x]);}
  56. int main()
  57. {
  58. t=read();
  59. while(t--)
  60. {
  61. n=read(),m=read();
  62. reset();
  63. rep(i,1,m){int x=read(),y=read(),l=read(),a=read();ade(x,y,l),ade(y,x,l),e[i].u=x,e[i].v=y,e[i].w=a;}
  64. sort(e+1,e+m+1,cmp);
  65. dis[1]=0;Q.push(mp(0,1));
  66. while(!Q.empty())
  67. {
  68. int u=Q.top().se;Q.pop();
  69. if(vis[u])continue;vis[u]=1;
  70. view(u,k)if(dis[v[k]]>dis[u]+w[k])
  71. {
  72. dis[v[k]]=dis[u]+w[k];
  73. if(!vis[v[k]])Q.push(mp(-dis[v[k]],v[k]));
  74. }
  75. }
  76. rep(i,1,n)mind[i]=dis[i];
  77. rep(i,1,m)
  78. {
  79. int x=f(e[i].u),y=f(e[i].v);
  80. if(x!=y)
  81. {
  82. cntnd++,val[cntnd]=e[i].w,anc[-fa[x]][0]=anc[-fa[y]][0]=cntnd,mind[cntnd]=min(mind[-fa[x]],mind[-fa[y]]);
  83. fa[x]=y,fa[y]=-cntnd;
  84. }
  85. }
  86. dwn(i,cntnd,1){rep(j,1,19)anc[i][j]=anc[anc[i][j-1]][j-1];}
  87. q=read(),k=read(),s=read();
  88. while(q--)
  89. {
  90. int u=read(),p=read(),tu;
  91. u=(u+k*ans-1)%n+1,p=((LL)p+(LL)k*ans)%(LL)(s+1),tu=u;
  92. dwn(i,19,0)if(anc[tu][i]&&val[anc[tu][i]]>p)tu=anc[tu][i];
  93. write(ans=mind[tu]);
  94. }
  95. }
  96. return 0;
  97. }
  98. /*
  99. 2
  100. 4 3
  101. 1 2 50 1
  102. 2 3 100 2
  103. 3 4 50 1
  104. 5 0 2
  105. 3 0
  106. 2 1
  107. 4 1
  108. 3 1
  109. 3 2
  110. 4 3
  111. 1 2 50 1
  112. 2 3 100 2
  113. 3 4 50 1
  114. 5 0 2
  115. 3 0
  116. 2 1
  117. 4 1
  118. 3 1
  119. 3 2
  120. */

并不对劲的bzoj5415:loj2718:uoj393:p4768:[NOI2018]归程的更多相关文章

  1. Luogu P4768 [NOI2018]归程(Dijkstra+Kruskal重构树)

    P4768 [NOI2018]归程 题面 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点. \(m\) 条边的无向连通图(节点的编 ...

  2. P4768 [NOI2018]归程(kruskal 重构树)

    洛谷P4768 [NOI2018]归程 LOJ#2718.「NOI2018」归程 用到 kruskal 重构树,所以先说这是个啥 显然,这和 kruskal 算法有关系 (废话 这个重构树是一个有点权 ...

  3. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  4. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  5. Luogu P4768 [NOI2018]归程

    题目链接 \(Click\) \(Here\) \(Kruskal\)重构树的好题.想到的话就很好写,想不到乱搞的难度反而相当高. 按照点的水位,建出来满足小根队性质的\(Kruskal\)重构树,这 ...

  6. 洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)

    闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集D ...

  7. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

  8. 洛谷 P4768 [NOI2018]归程

    洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...

  9. P4768 [NOI2018]归程

    \(\color{#0066ff}{题目描述}\) 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n) ...

随机推荐

  1. Android UI自定义Spinner下拉框(用popuwindow实现)-转

    定义出第一个图片的布局和弹出框(一个listView)的布局,,这里就不在多说了~ListView需要自己定义一个MyspinnerAdapter~做好这些准备之后,就是弹出框的实现了~  prote ...

  2. excel批量导入数据库SQL server

    思路: 第一是文件上传,可以参照Jakarta的FileUpload组件,用普通的Post也就行了.第二是Excel解析,用JSL或者POI都行第三是数据保存,这个应该简单吧,一个循环,一行对应一条数 ...

  3. JS基础之BOM对象

    BOM 对象 JavaScript分为 ECMAScript,DOM,BOM. BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其 ...

  4. Idea配置Tomcat以及maven

    配置Tamcat Run-->Edit Configurations +-->如果列表里没有tomcat-->点击33 items more irrelevant继续寻找--> ...

  5. codevs 2964公共素数因数

    2964 公共素数因数  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 小单同学刚学习了一个数分解成几个素 ...

  6. Java并发编程,Condition的await和signal等待通知机制

    Condition简介 Object类是Java中所有类的父类, 在线程间实现通信的往往会应用到Object的几个方法: wait(),wait(long timeout),wait(long tim ...

  7. 蓝桥java 入门训练 Fibonacci数列

    import java.util.Scanner; public class Main{ public static void main(String[] args) { int maxn=10000 ...

  8. java集合系列之ArrayList源码分析

    java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...

  9. crontab 实际的应用

    每二天执行一次: 0 0 */2 * * command #注意分,时不能为星*,否则每分钟执行 每天零晨01,03执行: 0 01,03 * * * command 每2小时执行一次 0 */2 * ...

  10. mac 安装ANT

    http://blog.csdn.net/crazybigfish/article/details/18215439 1.下载ant:官网下载 当前最新版是Apache Ant 1.9.3,可以下载那 ...