[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重构树)的更多相关文章

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

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

  2. BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路

    BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...

  3. [NOI2018]归程 kruskal重构树

    [NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...

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

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

  5. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

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

  6. BZOJ 5415: [Noi2018]归程(kruskal重构树)

    解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...

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

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

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

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

  9. 学习笔记:Kruscal 重构树

    网上感觉没有什么很详细 + 证明的讲解啊) 前置:Kruskal 求最小生成树. 这个算法可以将一棵树 / 无向连通图重构成一颗有性质的新树. 算法可以解决一些树上瓶颈边权之类的问题,可以把需要持久化 ...

随机推荐

  1. jieba (中文词频统计) 、collections (字频统计)、WordCloud (词云)

    py库: jieba (中文词频统计) .collections (字频统计).WordCloud (词云) 先来个最简单的: # 查找列表中出现次数最多的值 ls = [1, 2, 3, 4, 5, ...

  2. C# 使用 MsieJavaScriptEngine 引擎运行JavaScript

    用这个东西实现了一个js脚本引擎代码生成器,调研的时候这个东西的资料比较少. 我就根据自己的这点应用来讲解讲解,有错误,不符的地方还请园友指出. 使用 Nuget 安装 MsieJavaScriptE ...

  3. 运维自动化之ansible的安装与使用 转

    运维自动化之ansible的安装与使用 随着服务器数量的增长,我们需要一个批量工具去提高工作效率,之前用的是puppet,ansible的简单,适用让我眼前一亮,决定写一篇ansible从安装到基本配 ...

  4. linux fedora原生的快捷键操作

    显示桌面: ctrl+alt+d 运行终端程序: gnome-terminal : 可以自定义快捷键: ctrl+T 等等.

  5. [VBA]删除多余工作表

    sub 删除多余工作表() Dim i As Integer Application.DisplayAlerts = False For i = Worksheets.Count To 1 step ...

  6. 使用 circleci 自动部署 vuepress 到 github

    概述 今天我想把博客什么的搬到 github 的 vuepress 上面.但是每次提交 md 文件需要手动打包然后再提交到 github 的 gh-pages,非常麻烦.所以我去研究了一下用 circ ...

  7. robotframework之用户关键字的用法

    robotframework是一个关键字驱动框架,核心在于关键字的应用 目录 1.如何创建用户关键字 2.调用用户关键字 3.用户关键字的使用场景 1.如何创建关键字 第一种:直接在项目上右键,添加用 ...

  8. JS获取URL中参数值

    一.正则法: function getQueryString(name) { var reg = new RegExp('(^|&)' + name + '=([^&]*)(& ...

  9. Babel编译:类继承

    编译前 // 父类 class Fruit { static nutrition = "vitamin" static plant() { console.log('种果树'); ...

  10. 正则的?:pattern, ?=pattern, ?!pattern学习整理

    真正学习这次正则知识前,我是被这道题给难住了: # 目标文本 str1 = "ever1, ever2, never1, never2, never3, forever1, forever2 ...