[NOI2018]归程(kruscal重构树)
[NOI2018]归程
题面太长辣,戳这里
模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路。考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西。不过还是填一下这个坑。
STO YZK IOI2020捧杯<---学习笔记
然后自己yy写了重构树,感觉代码还算优美??吧
数组又又又又又又又又又开小了,dis数组也要开2*N。
#include<bits/stdc++.h>
#define Min(a,b) (a)<(b)?(a):(b)
#define lll long long
using namespace std;
int read()
{
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0') {if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}
const int N=400010;
int n,m,cnt,x,y,z,c,Q,zyys,s;lll asd,zxc,last;
int head[2*N];
bool vis[N];
int fa[2*N],deep[2*N],f[20][2*N];
lll dp[2*N],dis[N],v[2*N];
struct node{
lll v,to,next,h;
}edge[4*N];
struct Node{
int x,y,v,h;
}a[2*N];
void add(int x,int y,int z,int c)
{
cnt++;edge[cnt].to=y;edge[cnt].v=z;edge[cnt].h=c;
edge[cnt].next=head[x];head[x]=cnt;
}
priority_queue<pair<lll,int> >q;
bool cmp(Node p,Node q){return p.h>q.h;}
int gfa(int x){if(x==fa[x])return x;return fa[x]=gfa(fa[x]);}
void dijkstra()
{
memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));
q.push(make_pair(0,1));dis[1]=0;
while(q.size())
{
int u=q.top().second;q.pop();
if(vis[u]==true)continue;vis[u]=1;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].v)
dis[v]=dis[u]+edge[i].v,q.push(make_pair(-dis[v],v));
}
}
}
void dfs(int k,int father)
{
dp[k]=dis[k];
for(int i=head[k];i;i=edge[i].next)
{
int v=edge[i].to;if(v==father)continue;
deep[v]=deep[k]+1;f[0][v]=k;dfs(v,k);
dp[k]=Min(dp[k],dp[v]);
}
}
void init()
{
for(int i=1;i<=19;i++)for(int j=1;j<=n;j++)
f[i][j]=f[i-1][f[i-1][j]];
}
int lca(int x,lll y)
{
for(int i=19;i>=0;i--)
{
if(v[f[i][x]]>y) x=f[i][x];
}
return x;
}
int main()
{
int t=read();
while(t--)
{
n=read();m=read();int nn=n;
cnt=0;memset(head,0,sizeof(head));
for(int i=1;i<=m;i++)
{
x=read();y=read();z=read();c=read();
add(x,y,z,c);add(y,x,z,c);
a[i].x=x;a[i].y=y;a[i].v=z;a[i].h=c;
}
dijkstra();
cnt=0;memset(head,0,sizeof(head));
for(int i=1;i<=n;i++) fa[i]=i;
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++)
{
int xx=gfa(a[i].x),yy=gfa(a[i].y);
if(xx==yy)continue;
n++;fa[n]=n;fa[xx]=n;fa[yy]=n;v[n]=a[i].h;
add(n,xx,v[n],0);add(xx,n,v[n],0);add(n,yy,v[n],0);add(yy,n,v[n],0);
}
deep[n]=1;dfs(n,0);init();
Q=read();zyys=read();s=read();last=0;
for(int i=1;i<=Q;i++)
{
asd=read();zxc=read();
asd=(asd+zyys*last-1)%nn+1;zxc=(zxc+zyys*last)%(s+1);
last=dp[lca(asd,zxc)];
printf("%lld\n",last);
}
}
}
[NOI2018]归程(kruscal重构树)的更多相关文章
- 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树
正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...
- BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路
BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- BZOJ 5415: [Noi2018]归程(kruskal重构树)
解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...
- 学习笔记:Kruscal 重构树
网上感觉没有什么很详细 + 证明的讲解啊) 前置:Kruskal 求最小生成树. 这个算法可以将一棵树 / 无向连通图重构成一颗有性质的新树. 算法可以解决一些树上瓶颈边权之类的问题,可以把需要持久化 ...
随机推荐
- IE浏览器中图片路径正确< img ... />标签不显示图片
如下图所示,下面的html要去加载上面的jpg图片: 代码如下: <img src="luzhanshi1.jpg" alt="图片加载失败"> 使 ...
- 异步分发任务celery
Celery简介 Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单. celery适用异步处理问题,当遇到发送邮件.或者文件上传, 图像处理等等一些比较耗时的 ...
- ssh 多秘钥管理和坑
概述 很久之前就想研究一下 ssh 的多秘钥管理,今天正好有时间就研究了一下,挺简单的,记录下来,供以后开发时参考,相信对其他人也有用. 参考资料: Git - 生成 SSH公钥 , Linux 下多 ...
- C#中winform下利用ArcEngine调用ArcGIS Server发布的服务 AE9.3
主要使用了AE中的IAGSServerOject接口及IMapServer接口.Private void GetServerTest_Click(object sender, EventArgs e) ...
- 关于自定义 List集合排序的方法!
大致流程: 排序是用到排序的接口Comparator<T>你要先建一个类实现比较器Comparator //大致流程public class StuComp implements Comp ...
- OpenStack Placement Project
目录 文章目录 目录 背景 Placement 简介 基本概念 数据模型解析 Command Line Placement Web Application 的实现与分析 Placement 在启动虚拟 ...
- Jmeter之循环控制器
在使用Jmeter测试时,部分接口需要循环执行多次,这时候就可以使用循环控制器去控制执行. 循环控制器如下图: 说明 : (1.名称:标识,建议明确此循环控制器的使用的作用是什么(如:登录循环控制) ...
- Linux下编译安装Python-3.6.5
1.下载Python-3.6.5安装包 在Python官网(https://www.python.org/downloads/)下载对应的安装包,选择3.6.5的linux版本,如下图: 2.将安装包 ...
- yum 下载rpm包 安装rpm包依赖关系
方法一:yumdownloader 工具 1.安装工具包 yum install yum-utils -y 2.下载一个RPM包 yumdownloader <package-name> ...
- LeetCode.859-伙伴字符串(Buddy Strings)
这是悦乐书的第330次更新,第354篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第200题(顺位题号是859).给定两个字母A和B的小写字母,当且仅当我们可以在A中交换 ...