NOI Day1T1归程(Kruskal重构树+Dijkstra)
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)的更多相关文章
- NOI 2018 归程 (Kruskal重构树)
题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...
- loj2718 「NOI2018」归程[Kruskal重构树+最短路]
关于Kruskal重构树可以翻阅本人的最小生成树笔记. 这题明显裸的Kruskal重构树. 然后这题限制$\le p$的边不能走,实际上就是要满足走最小边权最大的瓶颈路,于是跑最大生成树,构建Krus ...
- BZOJ 5415: [Noi2018]归程(kruskal重构树)
解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- #2718. 「NOI2018」归程 kruskal重构树
链接 https://loj.ac/problem/2718 思路 我们希望x所在的连通块尽量的大,而且尽量走高处 离线的话可以询问排序,kruskal过程中更新答案 在线就要用kruskal重构树 ...
随机推荐
- Form表单的主要Content-Type
在Spa单页面横行的时代,前后端交互基本都是Json交互(也有通过FormData的,比如上传文件).而在之前的Jsp,Php前后不分家的时候,前后交互好大一部分都是通过Form表单来完成的.From ...
- cut 从文本中提取一段文字并输出
1.命令功能 cut 从每个文件中截取选定部分并输出. 2.语法格式 cut option file 参数说明 参数 参数说明 -b (–bytes) 字节 -c (--characters) 字 ...
- python笔记(1)--基础知识
一.注释 单行注释 #打印“hello world” print("hello.world!") 另外一种单行注释 print("hello,world!") ...
- 1N4148
摘自http://baike.baidu.com/link?url=0iTO7zZvHpCeJiZurTPpjDT95YdJu7cKdTeCWfol36b4JG5ii15leQ7K4wJWAZIBNb ...
- spring boot 集成 websocket 实现消息主动推送
spring boot 集成 websocket 实现消息主动 前言 http协议是无状态协议,每次请求都不知道前面发生了什么,而且只可以由浏览器端请求服务器端,而不能由服务器去主动通知浏览器端,是单 ...
- Spring MVC (二)
一.使用 @RequestMapping 映射请求 Spring MVC使用@RequestMapping注解为控制器指定可以处理哪些URL请求 在控制器的类定义以及方法定义处都可以标注 类定义处:提 ...
- linux下将一系列.o文件打包成.a文件
参考链接:https://www.cnblogs.com/joshtao/p/7380627.html
- vue框架搭建--移动端
由于Vue官方提供了vue-cli手脚架,所以快速构建出个简单的项目框架.在做移动端项目时,因为移动端的特性可能会用到些比较常用的插件,就在这里简单介绍如何使用 这里只介绍怎么在项目中安装引用和简单的 ...
- 【テンプレート】LCA
LCA目前比较流行的算法主要有tarjian,倍增和树链剖分 1)tarjian 是一种离线算法,需要提前知道所有询问对 算法如下 1.读入所有询问对(u,v),并建好树(建议邻接表) 2.初始化每个 ...
- QT5 QTreeView添加右键菜单
C++ QT5学习--QTreeView控件创建右键菜单 QTreeView是QWidget的子类,我们再改写QTreeView类的时候,注意的是继承关系. 1.TreeView.h class Tr ...