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

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. Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》

    当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台.几十台.几百台.然而,用户访问时是通过如http://www.XX.com的方式访问,在请求时,浏览器首先会查询DNS服务 ...

  2. [WC2012]记忆中的水杉树

    https://www.luogu.org/problemnew/show/P4125 题解 首先一开始所有的线段互不相交. 那么对于第二问来说,一定存在一种方法使得所有线段都朝着一个方向动. 比如说 ...

  3. Favorite Donut

    Favorite Donut Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  4. Java学习、面试、求职、干货资源精品合集

    本系列文章整合了本号发表和转载过的,有关Java学习.进阶.面试.做项目.求职经验等方面的文章,希望对想要找工作,以及正在找工作的你,能够有所帮助. 原创Java学习专题文章: 如何才能够系统地学习J ...

  5. PHP 常用算法【总结】

    一.声明数组 ini_set("max_execution_time", "12000"); $arr = [2,4,1,7,33,4,5,6,7,11,1,0 ...

  6. openstack介绍及共享组件——消息队列rabbitmq

    一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 IT系统架构的发展到目前为止大致 ...

  7. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站

    环境准备 三台主机: 一台主机部署jenkins和作为ansible的管理主机 一台主机部署gitlab和ansible的节点1 一台主机为ansible的节点2 防火墙和apache服务关闭 第一步 ...

  8. 理解jquery的$.extend()、$.fn.extend()【jQuery插件机制】

    /** * 操作数据 | DOM 操作 * @description jQuery类添加类方法,可以理解为添加静态方法,将一个或多个对象的内容合并到目标对象 * @use $.fn.zhang() | ...

  9. poj3280Cheapest Palindrome

    给定一个字符串S,字符串S的长度为M(M≤2000),字符串S所含有的字符的种类的数量为N(N≤26),然后给定这N种字符Add与Delete的代价,求将S变为回文串的最小代价和. Input 第一行 ...

  10. Netty内存管理器ByteBufAllocator及内存分配

    ByteBufAllocator 内存管理器: Netty 中内存分配有一个最顶层的抽象就是ByteBufAllocator,负责分配所有ByteBuf 类型的内存.功能其实不是很多,主要有以下几个重 ...