目录

  • NOI2018 Day1 return
  • 题解
  • AC代码:

NOI2018 Day1 return

题解

作为NOI Day1 的T1,这道题目还是比较清真的(虽然自己在同步赛的时候只打了70分的部分分,然后数组开小了挂成了55分。。)正解的方法似乎有很多,可持久化并查集什么的都可以做。但个人认为还是Kruskal重构树的方法比较好些,也比较容易一点。 Kruskal重构树的基础还是像Kruskal生成树一样,先把边sort,再一条一条加进生成树中。而重构树唯一不同的点是当重构树在进行两个联通块合并的时候,并不是直接将其合并,而是新建一个父节点,其点权为当前枚举到的边的边权。这样显然的Kruskal重构树就会有两个比较重要的性质了:
①这颗重构树是个二叉树(虽然在这里并没有什么用)
②这棵树是个大(小)根堆
知道了这一点我们就可以开始做这道题了。我们先按海拔从大到小将每条边的排序,然后做Kruskal重构树,这样我们生成的Kruskal重构树就是一棵以海拔为关键字的小根堆,同时他会有一些性质:如果一条边被水淹没了(在重构树中就是那条边所对应的点),那么这个节点的所有父节点都会被水淹没,并且如果这条边没有被水淹没,那么它的子树的任意一个点也不会被水淹没,于是这棵子树的任意两个点都可以通过开车到达。于是我们就可以先跑一边最短路(出题人:SPFA死掉了),然后在进行构造Kruskal重构树的时候维护子树中到根的最短距离Mn。对于每一个询问,我们只需要倍增在重构树上找到未被水淹没的深度最浅的节点,然后返回这个节点的Mn的值就行了,还是比较好写的。

AC代码:

#pragma GCC optimize (2)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
/*================Header Template==============*/
const int maxn=4e5+500;
typedef pair<ll,int>P;
#define fi first
#define se second
int n,m,T,tot,waytot,ndcnt,Q,k,s,cnt;
ll ans;
int head[maxn],fa[maxn<<1],val[maxn<<1],Head[maxn<<1],deep[maxn<<1],p[maxn][22];
ll dis[maxn],Mn[maxn<<1];
bool vis[maxn];
struct edge {int to,nxt,l,h;
}E[maxn<<2];
struct sortedge {int f,t,l,h;bool operator < (const sortedge &rhs) const {return h>rhs.h;}
}EE[maxn<<2];
struct way {int to,nxt;
}G[maxn<<4];
/*==================Define Area================*/
void FO() {freopen("return.in","r",stdin);freopen("return.out","w",stdout);
}namespace doit {void init() {ans=tot=waytot=cnt=0;memset(head,-1,sizeof head);memset(Head,-1,sizeof Head);for(int i=1;i<=200000;i++) {fa[i]=i;}}void addedge(int u,int v,int h,int l) {E[++tot].to=v;E[tot].nxt=head[u];head[u]=tot;E[tot].h=h;E[tot].l=l;E[++tot].to=u;E[tot].nxt=head[v];head[v]=tot;E[tot].h=h;E[tot].l=l;}void Dj() {priority_queue<P,vector<P>,greater<P> >Q;while(!Q.empty()) Q.pop();memset(vis,0,sizeof vis);memset(dis,0x7f,sizeof dis);dis[1]=0;Q.push(P(dis[1],1));while(!Q.empty()) {P p=Q.top();Q.pop();int idx=p.se;ll dist=p.fi;vis[idx]=1;for(int i=head[idx];~i;i=E[i].nxt) {int to=E[i].to;if(vis[to]) continue;if(dis[to]>dist+E[i].l) {dis[to]=dist+E[i].l;Q.push(P(dis[to],to));}}}}
}namespace KruskalTree {void addway(int u,int v) {G[++waytot].to=v;G[waytot].nxt=Head[u];Head[u]=waytot;G[++waytot].to=u;G[waytot].nxt=Head[v];Head[v]=waytot;}int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}void unite(int x,int y,int v) {int fx=find(x),fy=find(y);if(fx==fy) return ;++ndcnt;addway(fx,ndcnt);addway(fy,ndcnt);Mn[ndcnt]=min(Mn[fx],Mn[fy]);fa[ndcnt]=ndcnt;fa[fx]=ndcnt;fa[fy]=ndcnt;val[ndcnt]=v;return ;}void Kruskal() {ndcnt=n;for(int i=1;i<=n;i++) {Mn[i]=dis[i];}for(int i=1;i<=cnt;i++) {unite(EE[i].f,EE[i].t,EE[i].h);}}
}namespace LCA {void dfs(int o,int ff,int dep) {deep[o]=dep;p[o][0]=ff;for(int i=Head[o];~i;i=G[i].nxt) {int to=G[i].to;if(to==ff) continue;dfs(to,o,dep+1);}}void Cal() {for(int i=1;i<=20;i++) {for(int j=1;j<=ndcnt;j++) {p[j][i]=p[p[j][i-1]][i-1];}}}int Solve(ll o,ll a) {for(int i=20;i>=0;i--) {if(p[o][i]&&val[p[o][i]]>a) o=p[o][i]; }return o;}
}
using namespace doit;
using namespace KruskalTree;
using namespace LCA;int main() {FO();read(T);while(T--) {init();read(n);read(m);for(int i=1,u,v,h,l;i<=m;i++) {read(u);read(v);read(l);read(h);addedge(u,v,h,l);EE[++cnt].f=u;EE[cnt].t=v;EE[cnt].l=l;EE[cnt].h=h;}Dj();sort(EE+1,EE+1+cnt);Kruskal();dfs(ndcnt,0,1);Cal();read(Q);read(k);read(s);while(Q--) {ll v,p;read(v);read(p);v=(v+k*ans-1)%n+1;p=(p+k*ans)%(s+1);int o=Solve(v,p);ans=Mn[o];printf("%lld\n",ans);}}
}

转载于:https://www.cnblogs.com/Apocrypha/p/9430500.html

NOI2018 Day1 归程(Kruskal重构树)相关推荐

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

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

  2. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)

    LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...

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

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

  4. 洛谷 - P4768 [NOI2018]归程(Kruskal重构树+树上倍增+最短路)

    题目链接:点击查看 题目大意:去原网址看吧 题目分析:因为是在刷克鲁斯卡尔重构树的题目,所以稍微思考一下就能想出解法了,首先如果水位线固定了,剩下的边组成的最小生成树也是一定的,此时同一个连通块内的点 ...

  5. P4768 [NOI2018] 归程 Kruskal重构树 + 倍增 + 最短路

    传送门 文章目录 题意: 思路: 题意: 给你一个联通无向图,每条边有一个长度lll和海拔aaa,当海拔≤\le≤水位线的时候,说明这个道有积水.在起始点有一辆车,车可以走没有积水的路,下车后可以走有 ...

  6. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

  7. NOI2018 D1T1 洛谷P4768 归程 (Kruskal重构树)

    题目传送门 实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中 ...

  8. 【NOI2018】归程(kruskal重构树)

    这道题最后会化为这么一个问题:给一张图,每条边都有边权,多组询问,每次给出 u , k u,k u,k,问从 u u u 开始走,只走边权 ≤ k \leq k ≤k 的边,请维护 u u u 能走到 ...

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

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

最新文章

  1. Spring Boot项目整合Retrofit最佳实践,最优雅的HTTP客户端工具!
  2. 萌新资源 | 3D基础——渲染基本原理介绍
  3. python实现傅里叶变换求幅值和相位_Python 实现图像快速傅里叶变换和离散余弦变换...
  4. 基于visual Studio2013解决面试题之0702输出数字
  5. Matlab7.0安装之后Runtime Error警告解决办法
  6. 入门微信小程序[第六篇]微信小程序 -- 大樱桃的安排
  7. iOS中UINavigationController控制器使用详解
  8. 边缘计算对于基础架构和运营领导者意味着什么
  9. 害!!安装电脑系统 分区就那么点事
  10. 阿里云服务器购买后如何做好安全防护?
  11. 思科 计算机网络 测试
  12. 处理效应模型stata实例_『Stata』政策处理效应PSM模型基本命令汇总
  13. CPAL脚本自动化测试 ———— Diagnostic 系列函数
  14. 机器学习方法提高静态图片清晰度
  15. java换行转义字符串_回车,换行,转义字符“\r”,“\n”是什么关系?
  16. Richard 外推法求梯度
  17. chrome控制台设置网页自动刷新
  18. 14、MyBatis-Plus入门到进阶
  19. CPU锁频率在0.78 GHz
  20. USB协议详解第0讲(系列博文介绍)

热门文章

  1. 学习红黑树过程中的个人总结
  2. Python学习记录--关于列表和字典的比较
  3. iOS NSString追加字符串的方法
  4. 16.Java中的String详解
  5. Java 8 新的时间日期库java.time
  6. 撸一个vue的双向绑定
  7. 将文件复制到FTP服务器时发生错误的解决办法
  8. 设计模式7大结构型模式
  9. Exchange 2016 CU9 已发布
  10. xcode工程编译错误:The maximum number of apps for free development profiles has been reached.