NOI Day1T1归程(Kruskal重构树+Dijkstra)

题目

洛谷题目传送门

题解

其实我不想写......,所以......

挖个坑......我以后一定会补的

luogu的题解讲的还是很详细的......

恩,感谢cwen详细教我做这道题,让我2遍A

然后我丑陋的代码(代码太长,所以压得很丑)

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#include<stack>
#include<vector>
#define rg register
#define il inline
#define lst long long
#define ldb long double
#define N 400050
#define M 800050
using namespace std;
const lst Inf=1e16;
il int read()
{
rg int s=0,m=0;rg char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')m=1;ch=getchar();}
while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int n,m,Q,K,S,u,p;
int cnt,tot;
lst ans;
int hd[N],fa[N];
lst dis[N],tr_dis[N];
lst f[N][25],g[N][25];
struct WAY{int u,v;lst w,h;}edge[M];
struct EDGE{int to,nxt;lst v,h;}ljl[M<<1];
il int operator<(rg const WAY &a,rg const WAY &b){return a.h>b.h;} il void memt()
{
cnt=0;
memset(hd,0,sizeof(hd));
memset(ljl,0,sizeof(ljl));
}
il void add(rg int p,rg int q,rg int o,rg int hi){ljl[++cnt]=(EDGE){q,hd[p],o,hi},hd[p]=cnt;}
int vis[N];
struct hh{lst D;int id;};
bool operator<(rg const hh &a,rg const hh &b){return a.D>b.D;}
priority_queue <hh> H;
il void Dijkstra()
{
for(rg int i=1;i<=n;++i)vis[i]=0,dis[i]=Inf;
dis[1]=0,H.push((hh){0,1});
while(!H.empty())
{
rg hh S=H.top();H.pop();
rg int now=S.id;
if(vis[now])continue;
vis[now]=1;
for(rg int i=hd[now];i;i=ljl[i].nxt)
{
rg int qw=ljl[i].to;
if(dis[qw]>dis[now]+ljl[i].v)
{
dis[qw]=dis[now]+ljl[i].v;
H.push((hh){dis[qw],qw});
}
}
}
}
int find_fa(rg int now)
{
if(fa[now]==now)return now;
return fa[now]=find_fa(fa[now]);
}
il void Kruskal()
{
rg int nn=2*n;tot=n;
for(rg int i=1;i<=nn;++i)fa[i]=i;
sort(edge+1,edge+m+1);
for(rg int i=1;i<=m;++i)
{
rg int u=edge[i].u,v=edge[i].v;
rg int fx=find_fa(u),fy=find_fa(v);
if(fx!=fy)
{
tot++;
add(tot,fx,0,edge[i].h);
add(tot,fy,0,edge[i].h);
fa[fx]=fa[fy]=tot;
if(tot==nn-1)break;
}
}
} void dfs(rg int now,rg int fm,rg lst up)
{
f[now][0]=fm,g[now][0]=up;
for(rg int j=1;j<=20;++j)
{
f[now][j]=f[f[now][j-1]][j-1];
g[now][j]=min(g[now][j-1],g[f[now][j-1]][j-1]);
}
for(rg int i=hd[now];i;i=ljl[i].nxt)
{
rg int qw=ljl[i].to;
if(qw!=fm)
dfs(qw,now,ljl[i].h);
tr_dis[now]=min(tr_dis[qw],tr_dis[now]);
}
} int main()
{
for(rg int T=read();T;T--)
{
memt();
n=read(),m=read();
for(rg int i=1;i<=m;++i)
{
rg int p=read(),q=read(),o=read(),hi=read();
add(p,q,o,hi),add(q,p,o,hi);
edge[i]=(WAY){p,q,o,hi};
}
Dijkstra(),memt();
Kruskal();
for(rg int i=1;i<=n;++i)tr_dis[i]=dis[i];
for(rg int i=n+1;i<=tot;++i)tr_dis[i]=Inf;
dfs(tot,0,0);
ans=0;
Q=read(),K=read(),S=read();
while(Q--)
{
u=read(),p=read();
u=(u+K*ans-1)%n+1;
p=(p+K*ans)%(S+1);
for(rg int j=19;j>=0;--j)
if(g[u][j]>p)u=f[u][j];
ans=tr_dis[u];
printf("%lld\n",ans);
}
}
return 0;
}

NOI Day1T1归程(Kruskal重构树+Dijkstra)的更多相关文章

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

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

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

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

  3. [NOI2018]归程 kruskal重构树

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

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

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

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

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

  6. loj2718 「NOI2018」归程[Kruskal重构树+最短路]

    关于Kruskal重构树可以翻阅本人的最小生成树笔记. 这题明显裸的Kruskal重构树. 然后这题限制$\le p$的边不能走,实际上就是要满足走最小边权最大的瓶颈路,于是跑最大生成树,构建Krus ...

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

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

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

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

  9. #2718. 「NOI2018」归程 kruskal重构树

    链接 https://loj.ac/problem/2718 思路 我们希望x所在的连通块尽量的大,而且尽量走高处 离线的话可以询问排序,kruskal过程中更新答案 在线就要用kruskal重构树 ...

随机推荐

  1. Object of type 'ndarray' is not JSON serializable

    Object of type 'ndarray' is not JSON serializable import numpy as np import json arr=np.asarray([345 ...

  2. ReentrantLock等待通知机制Condition介绍

    Object类中的wait(),notify()和notifyAll()可以实现线程的等待通知模型,同样在ReentrantLock中可以借助Condition来完成这种机制.本篇就简要介绍Condi ...

  3. MySQL 保存镜像实战操作( 拷贝方法 )

    查看数据保存的位置 docker inspect --format='{{.Mounts}}' mxg_mysql 容器路径为:`/var/lib/mysql` ,宿主机数据保存在: /var/lib ...

  4. Python not and or

    刷题时候,有道题目的答案是 return(num and (num % 9 or 9)) 看的有点懵逼,看来解释如下: 1.首先,’and’.’or’.’not’的优先级是not>and> ...

  5. CF 82 D.Two out of Three

    前言 全网唯一不同题解 设 \(f[i][j]\) 表示第 \(i\) 次选取留下来的数是 \(k\) 的最小花费 枚举前面的留下来的点 \(k\) 当前能留下的点只有 \((2*i),(2*i+1) ...

  6. CSS3 flexbox弹性布局实例

    常用例子 1.居中对齐 <!DOCTYPE html> <head> <meta charset="utf-8"> <style type ...

  7. 前端面试题1(HTML篇)

    HTML 语义化 HTML标签的语义化是指:通过使用包含语义的标签(如h1-h6)恰当地表示文档结构 css命名的语义化是指:为html标签添加有意义的class 为什么需要语义化: 去掉样式后页面呈 ...

  8. R语言里面的循环变量

    for (i in 1:10) { print("Hello world") } 以上这条命令执行完之后,变量i会被保存下来!并且,i的值将是10. 程序中有多处循环的时候要非常注 ...

  9. js----定义变量的几种方式

    const const定义的变量不可以修改,而且必须初始化 const b = 2 //正确 //const b //错误,没有初始化 console.log('函数外const定义b:' + b); ...

  10. 【leetcode】1031. Maximum Sum of Two Non-Overlapping Subarrays

    题目如下: Given an array A of non-negative integers, return the maximum sum of elements in two non-overl ...