今天也要踏上归程了呢~(题外话

kruskal重构树!当时就听学长们说过是重构树辣所以做起来也很快233

就是我们按照a建最大生成树 这样话呢我们就可以通过生成树走到尽量多的点啦

然后呢就是从这个子树内走到1的最短路 提前处理出来然后就是子树最小值啦w

附代码。(些许丑陋(

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#define ll long long
#define inf 20021225
#define N 400010
#define M 800010
using namespace std;
struct edge{int x,y,v;}g[M];
struct edg{int to,lt,v;}e[M],t[N];
struct node
{
int id,v;
node(){}
node(int _id,int _v){id=_id,v=_v;}
};
bool operator <(node a,node b){return a.v>b.v;}
priority_queue<node> q;
int cnt,in[N];
void add(int x,int y,int l,int a)
{
e[++cnt].to=y; e[cnt].lt=in[x]; e[cnt].v=l; in[x]=cnt;
e[++cnt].to=x; e[cnt].lt=in[y]; e[cnt].v=l; in[y]=cnt;
g[cnt>>].x=x; g[cnt>>].y=y; g[cnt>>].v=a;
}
void tree(int x,int y)
{
t[++cnt].to=y; t[cnt].lt=in[x]; in[x]=cnt;
}
int bel[N],n,val[N],m; bool vis[N];
int find(int x)
{
//printf("%d %d\n",x,bel[x]);
if(bel[x]==x) return x;
return bel[x]=find(bel[x]);
}
void dijkstra()
{
memset(vis,,sizeof(vis));
memset(val,,sizeof(val)); val[]=;
q.push(node(,val[]));
while(!q.empty())
{
node tmp = q.top(); q.pop();
if(vis[tmp.id]) continue;
vis[tmp.id]=; int x=tmp.id;
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to; if(val[y]>val[x]+e[i].v)
val[y]=val[x]+e[i].v,q.push(node(y,val[y]));
}
}
}
bool cmp(edge x,edge y){return x.v>y.v;}
int poi;
int mn[N],f[N][];
void kruskal()
{
//memset(bel,0,sizeof(bel));
sort(g+,g+m+,cmp); memset(mn,,sizeof(mn));
memset(in,,sizeof(in)); cnt=; poi=n;
for(int i=;i<=m;i++)
{
int x=g[i].x,y=g[i].y;
int fx=find(x),fy=find(y);
if(fx==fy) continue;
val[++poi]=g[i].v;
tree(poi,fx); tree(poi,fy);
bel[fx]=bel[fy]=poi;
}
}
void dfs(int x)
{
vis[x]=;
for(int i=;i<;i++)
f[x][i]=f[f[x][i-]][i-];
for(int i=in[x];i;i=t[i].lt)
{
int y=t[i].to; f[y][]=x;
dfs(y); mn[x]=min(mn[x],mn[y]);
}
if(x<=n) mn[x]=val[x];
}
int getans(int x,int w)
{
for(int i=;~i;i--)
if(val[f[x][i]]>w) x=f[x][i];
//printf("%d\n",val[x]);
return mn[x];
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
memset(in,,sizeof(in)); cnt=;
scanf("%d%d",&n,&m); int u,v,l,a;
for(int i=;i<=*n;i++) bel[i]=i;
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&u,&v,&l,&a);
add(u,v,l,a);
}
dijkstra(); kruskal(); memset(vis,,sizeof(vis));
for(int i=;i<*n;i++) if(!vis[i]) dfs(find(i));
int Q,k,s,lastans=,p;
scanf("%d%d%d",&Q,&k,&s); val[]=;
while(Q--)
{
scanf("%d%d",&v,&p);
v=(v+k*lastans-)%n+; p=(p+k*lastans)%(s+);
printf("%d\n",lastans=getans(v,p));
}
} return ;
}

BZOJ5415 [NOI2018] 归程的更多相关文章

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

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

  2. BZOJ5415:[NOI2018]归程(可持久化并查集,最短路)

    Description Input Output Sample Input1 14 31 2 50 12 3 100 23 4 50 15 0 23 02 14 13 13 2 Sample Outp ...

  3. [NOI2018]归程 kruskal重构树

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

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

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

  5. NOI2018 D1T1 [NOI2018]归程 解题报告

    P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...

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

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

  7. 题解 NOI2018 归程

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

  8. [NOI2018]归程(kruscal重构树)

    [NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...

  9. [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

    [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...

随机推荐

  1. 01.cordova 安装及项目创建

    1.安装cordova cnpm install -g cordova@6.0.0  这里用6.0.0版本,默认下载最新版本,创建项目时候会报错  2.创建项目 cordova create myap ...

  2. ANTLR4 实验总结

    问题总结: 1.不同类型编程语言之间转换的意义. 仅仅的字符替换?结构 2.编程语言转换的困难. 优先级:++运算符 不同语言有各自的优越性(Scala转C遇到困难) 编程思想冲突. 3.单纯应用在数 ...

  3. docker 搭建gitlab

    https://docs.gitlab.com/omnibus/docker/ https://blog.csdn.net/m0_37444820/article/details/81147452 h ...

  4. mysql_DML_select_子查询

    -------------------------------------------------------------------子查询---------------------   --1.子查 ...

  5. tools-eclipse-003-下载安装优化

    一.下载 1.1.jdk安装 下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装:不需要安装jre,默认会 ...

  6. Nginx 在各种语言框架下的配置 - 以 codeigniter 为例

    对于各种语言常用的框架,Nginx 在官方的 Wiki 页面的 入门 部分提供了示例配置文件.具体可以参考这个页面的 Pre-canned Configurations 部分,这里列出了各种框架. 直 ...

  7. Bootstrap 学习笔记11 按钮和折叠插件

     复选框: <div class="btn-group" data-toggle="buttons"> <label for="se ...

  8. DbWrench001--简介

    DbWrench--简介 mac下载地址:http://www.dbwrench.com/ DbWrench 工具等价于powerdesigner 均为数据库原型设计工具 DbWrench 详细介绍 ...

  9. 报错:Uncaught SyntaxError: Unexpected token)

    用JSON格式传值时,js一直 报这个错误:Uncaught SyntaxError: Unexpected token) 错误位置是:result=eval('('+result+')'): 原因: ...

  10. 《剑指offer》面试题9 斐波那契数列 Java版

    书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...