闲话

一个蒟蒻,在网络同步赛上进行了这样的表演——

T2组合计数不会,T3字符串数据结构不会,于是爆肝T1

一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去

然后写可持久化并查集Debug到13:20过了前4个样例,然后第5个T飞了。

FST?

。。。。。。

FST!

完美收获50分暴力分。

原来是按秩合并那里咕咕了。

从50到100的蜕变,只需一行,你值的拥有。

思路

不会kruscal重构树

容易发现,假设我们确定了水位线,那么就确定了图中有哪些边是连通的。这时候的答案该如何确定呢?因为车可以在一个连通块里随便开,所以同一个连通块里的点的答案都是一样的,为连通块内离\(1\)最近的点到\(1\)的距离。

那当然要首先把单源最短路求出来。SPFA死了?被固定了?(参考生物必修3),还好蒟蒻写的是dijkstra。

因为并查集只能合并,所以我们要按高度从大到小排序依次加边。如果是离线那好办了,把询问也按高度排个序,每在并查集里加一条边就可以完成若干个询问。

那强制在线?当然要把合并过程中的每个版本都存起来啦!用可持久化并查集(蒟蒻之前写过一篇blog

当然,高度要离散化,为了让每个询问通过二分找到对应版本。

复杂度\(O(n\log m+(m+q)\log^2n)\),当然这里写的有点丑,在倒序合并的过程中可以在外面放并查集,祖先到并查集里跳,比在可持久化并查集里跳快多了,复杂度\(O(n\log m+m\log n+q\log^2n)\)。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. #define UI unsigned int
  6. #define RG register
  7. #define I inline
  8. #define R RG UI
  9. #define G c=getchar()
  10. using namespace std;
  11. const int N=2e5+9,M=8e5+9,S=2e7;
  12. struct NODE{
  13. UI u,d;
  14. I bool operator<(RG NODE x)const{return d>x.d;}
  15. };//堆优化dijkstra的节点
  16. struct EDGE{
  17. UI u,v,a;
  18. I bool operator<(RG EDGE x)const{return a<x.a;}
  19. }e[M];//对边排序
  20. priority_queue<NODE>q;
  21. UI n,L,p,he[N],ne[M],to[M],l[M],a[M],b[M],d[N],rt[M],lc[S],rc[S],f[S],mn[S],dep[S];
  22. bool vis[N];
  23. I UI in(){
  24. RG char G;
  25. while(c<'-')G;
  26. R x=c&15;G;
  27. while(c>'-')x*=10,x+=c&15,G;
  28. return x;
  29. }
  30. void build(R&u,R l,R r){//建初始并查集
  31. u=++p;
  32. if(l==r){mn[u]=d[f[u]=l];return;}
  33. R m=(l+r)>>1;
  34. build(lc[u],l,m);
  35. build(rc[u],m+1,r);
  36. }
  37. UI ins(R*u,R v,R t){//插入
  38. R l=1,r=n,m;
  39. while(l!=r){
  40. *u=++p;m=(l+r)>>1;
  41. if(t<=m)r=m,rc[*u]=rc[v],u=lc+*u,v=lc[v];
  42. else l=m+1,lc[*u]=lc[v],u=rc+*u,v=rc[v];
  43. }
  44. return *u=++p;
  45. }
  46. UI getf(R rt,R t){//跳祖先
  47. R u,l,r,m;
  48. while(1){
  49. u=rt;l=1;r=n;
  50. while(l!=r){
  51. m=(l+r)>>1;
  52. if(t<=m)r=m,u=lc[u];
  53. else l=m+1,u=rc[u];
  54. }
  55. if(t==f[u])break;
  56. t=f[u];
  57. }
  58. return u;
  59. }
  60. int main(){
  61. freopen("return.in","r",stdin);
  62. freopen("return.out","w",stdout);
  63. R T=in(),m,i,j,u,v,w;
  64. while(T--){
  65. p=0;n=in();m=in();//时刻注意清空变量!
  66. for(i=1;i<=m;++i){
  67. u=in();v=in();
  68. ne[++p]=he[u];to[he[u]=p]=v;
  69. ne[++p]=he[v];to[he[v]=p]=u;
  70. l[p]=l[p-1]=in();
  71. e[i]=(EDGE){u,v,a[p]=a[p-1]=in()};
  72. }
  73. memset(d,-1,(n+1)<<2);//dijkstra开始
  74. p=d[1]=0;q.push((NODE){1,0});
  75. while(!q.empty()){
  76. RG NODE cur=q.top();q.pop();
  77. if(vis[u=cur.u])continue;
  78. vis[u]=1;
  79. for(i=he[u];i;i=ne[i])
  80. if(d[to[i]]>d[u]+l[i])
  81. q.push((NODE){to[i],d[to[i]]=d[u]+l[i]});
  82. }
  83. R q=in(),k=in(),s=in(),lans=0;
  84. sort(e+1,e+m+1);
  85. for(i=1;i<=m;++i)b[i]=e[i].a;
  86. b[m+1]=s+1;L=unique(b+1,b+m+2)-b-1;//离散化,注意加入s+1
  87. build(rt[L],1,n);
  88. for(i=L-1,j=m;i;--i){
  89. rt[i]=rt[i+1];
  90. for(;j&&e[j].a==b[i];--j){
  91. if((u=getf(rt[i],e[j].u))==(v=getf(rt[i],e[j].v)))continue;//可优化的地方
  92. if(dep[u]>dep[v])swap(u,v);//按秩合并
  93. f[ins(&rt[i],rt[i],f[u])]=f[v];
  94. w=ins(&rt[i],rt[i],f[v]);
  95. f[w]=f[v];mn[w]=min(mn[u],mn[v]);//因为按秩合并所以min必须要记
  96. dep[w]=dep[v]+(dep[u]==dep[v]);//50分就是因为这一行!
  97. }
  98. }
  99. while(q--){
  100. v=(in()+k*lans-1)%n+1;u=(in()+k*lans)%(s+1);
  101. printf("%u\n",lans=mn[getf(rt[upper_bound(b+1,b+L+1,u)-b],v)]);
  102. }//谨慎选择lower_bound和upper_bound
  103. memset(vis,0,n+1);
  104. memset(he,0,(n+1)<<2);
  105. memset(rt,0,(L+1)<<2);
  106. memset(lc,0,(p+1)<<2);
  107. memset(rc,0,(p+1)<<2);
  108. memset(f,0,(p+1)<<2);
  109. memset(mn,0,(p+1)<<2);
  110. memset(dep,0,(p+1)<<2);//该清空的都要清空
  111. }
  112. return 0;
  113. }

洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)的更多相关文章

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

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

  2. BZOJ5415:[NOI2018]归程(可持久化并查集,最短路)

    Description Input Output Sample Input1 14 31 2 50 12 3 100 23 4 50 15 0 23 02 14 13 13 2 Sample Outp ...

  3. 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)

    传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...

  4. 洛谷 P4768 [NOI2018]归程

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

  5. [NOI2018] 归程 可持久化并查集

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...

  6. [NOI2018]归程(可持久化并查集,Kruskal重构树)

    解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持 ...

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

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

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

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

  9. 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树

    正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...

随机推荐

  1. QueryHelper

    [1].[代码] QueryHelper.java 跳至 [1] package my.db; import java.io.Serializable; import java.math.BigInt ...

  2. Luogu P1129 [ZJOI2007]矩阵游戏

    题目意思还是比较直观的,而且这个建模的套路也很明显. 我们首先考虑从主对角线可以转移到哪些状态. 由于每一次操作都不会把同一行(列)的黑色方块分开.因此我们发现: 只要找出\(n\)个黑色棋子,让它们 ...

  3. virtual box问题记录

    1.已存在的虚拟机打开错误,可能是版本不一样的问题,我5.2.16版本,原虚拟机所属版本为4.3.12,换回4.3.12版本virtual box即可.

  4. STM32串口打印输出乱码的解决办法

    前言 最近在试用uFUN开发板,下载配套的Demo程序,串口数据输出正常,当使用另一个模板工程,调用串口printf调试功能时,输出的却是乱码,最后发现是外部晶振频率不一样.很多STM32开发板都是使 ...

  5. Hogp连接流程分析

    当BLE设备已经完成配对,并且完成GATT服务的搜索,下一步就开始profile 的连接流程了,一般LE设备都是走的HOGP的流程,我们这篇文章就分析一下hogp的连接流程. 连接是从framewor ...

  6. 【持续更新中···】Linux下的小技巧

    1.Linux回到上级文件的命令: cd ..回到上一级目录(注意:cd 和..中间有空格) cd ~回到home目录 cd -回到某一目录

  7. .net core实践系列之短信服务-为什么选择.net core(开篇)

    前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...

  8. IDEA启动服务阻塞,断点过程十分慢的问题

    使用debug无法启动项目但是使用run就可以启动程序,而且启动比以前的debug模式快的多 原因: 启动不了的原因是在项目中的方法上打了断点,导致项目无法继续编译 取消方法断点就可以了 在idea官 ...

  9. fft的实现

    private static Complex[] FFT1(Complex[] f) { int N=f.length; int power= (int) (Math.log10(N)/Math.lo ...

  10. rabbitMq实现与zookeeper类似的watcher功能

    场景:A.B.C.D(可以是一个机器的不同进程,也可以是不同机器的进程)启动了相同的项目,使用同一个数据库.但是,如果A修改了数据库的数据,需要B.C.D在很短的时间能够知道数据库发生了修改.当然可以 ...