题意:From https://www.cnblogs.com/Memory-of-winter/p/11628351.html

思路:先从1开始跑一遍dijkstra,建出kruskal重构树之后每个叶子结点的权值为它到1的距离

询问等价于从v开始只要倍增的点的权值>p就往上跳,这样跳到某个点u之后询问u的子树中叶子结点最小的权值

因为是静态的,实际上可以不把kruskal实际建出来,只要维护倍增数组和子树中最小值即可

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef pair<ll,int> Pli;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 400000+10
#define M 800000+10
#define INF 4e9+10
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1
#define fors(i) for(auto i:e[x]) if(i!=p) const int MOD=1e9+,inv2=(MOD+)/;
//int p=1e6+3;
//double eps=1e-6;
int dx[]={-,,,};
int dy[]={,,-,}; struct edge
{
int x,y,l,a;
}a[M]; bool cmp(edge a,edge b)
{
return a.a>b.a;
} ll dis[N],val[N];
int f[N][],head[N],vet[M],nxt[M],len[M],vis[N],fa[N],n,m,num,tot; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} ll readll()
{
ll v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b,int c)
{
nxt[++tot]=head[a];
vet[tot]=b;
len[tot]=c;
head[a]=tot;
} void dijkstra()
{
priority_queue<Pli> q;
rep(i,,n*) dis[i]=INF,vis[i]=;
q.push(MP(,)); dis[]=;
while(!q.empty())
{
int u=q.top().se;
q.pop();
if(vis[u]) continue;
vis[u]=;
int e=head[u];
while(e)
{
int v=vet[e];
if(dis[u]+len[e]<dis[v])
{
dis[v]=dis[u]+len[e];
q.push(MP(-dis[v],v));
}
e=nxt[e];
}
}
} int dsu(int k)
{
if(fa[k]!=k) fa[k]=dsu(fa[k]);
return fa[k];
} void Add(int x,int y)
{
f[y][]=x;
dis[x]=min(dis[x],dis[y]);
} int calc(int u,ll p)
{
per(i,,)
if(val[f[u][i]]>p) u=f[u][i];
return u;
} void build()
{
num=n;
rep(i,,*n) fa[i]=i;
sort(a+,a+m+,cmp);
rep(i,,m)
{
int p=dsu(a[i].x),q=dsu(a[i].y);
if(p!=q)
{
num++;
fa[p]=fa[q]=num;
val[num]=a[i].a;
Add(num,p);
Add(num,q);
if(num==*n-) break;
}
}
rep(i,,)
rep(j,,num) f[j][i]=f[f[j][i-]][i-];
} void solve()
{
int q=read(),k=read(),s=read();
ll lastans=;
while(q--)
{
int v=read();
ll p=readll();
if(k==)
{
v=(v-)%n+;
p=p%(s+);
}
else
{
v=(v+lastans-)%n+;
p=(p+lastans)%(s+);
}
int t=calc(v,p);
lastans=dis[t];
printf("%lld\n",lastans);
}
}
int main()
{
int cas=read();
while(cas--)
{
n=read(),m=read();
tot=;
rep(i,,n) head[i]=;
rep(i,,m)
{
a[i].x=read(),a[i].y=read(),a[i].l=read(),a[i].a=read();
add(a[i].x,a[i].y,a[i].l);
add(a[i].y,a[i].x,a[i].l);
}
dijkstra();
build();
solve();
}
return ;
}

【BZOJ5415&UOJ393】归程(Kruskal重构树,最短路)的更多相关文章

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

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

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

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

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

    NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...

  4. 【NOI2018】归程 题解(kruskal重构树+最短路)

    题目链接 题目大意:给定一张$n$个点$m$条边的无向图.每条边有长度和海拔.有$Q$次询问,每次给定起点$v$和当天水位线$p$,每次终点都是$1$.人可以选择坐车或走路,车只能在海拔大于水位线的路 ...

  5. [NOI2018]归程 kruskal重构树

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

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

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

  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. BZOJ 5415: [Noi2018]归程(kruskal重构树)

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

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

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

随机推荐

  1. python接口自动化-重定向(Location)

    一.重定向 1.重定向(redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置,从地址A跳转到地址B了. 2.重定向状态码: --301 redirect: 301 代表永久性转移( ...

  2. P3586 [POI2015]LOG

    传送门 对于询问,首先如果正数数量不到 $c$ 个显然无解 然后如果大于等于 $s$ 的数大于等于 $c$ 个,那么显然有解 否则,考虑贪心地取数,首先初始大于等于 $s$ 的哪些数我们每次取都可以取 ...

  3. 树莓派USB存储设备自动挂载并通过脚本实现自动拷贝,自动播放视频,脚本自动升级等功能

    需求:首先需要树莓派自动挂载USB设备,然后扫描USB指定目录下文件,将相关文件拷贝至树莓派指定目录,然后通过omxplayer循环播放新拷贝文件视频 1. 树莓派实现USB存储设备自动挂载 树莓派U ...

  4. Nginx启动错误 Failed to read PID from file /run/nginx.pid 的处理方法

    问题产生原因 因为 nginx 启动需要一点点时间,而 systemd 在 nginx 完成启动前就去读取 pid file 造成读取 pid 失败 解决方法 让 systemd 在执行 ExecSt ...

  5. 磁盘(disk)结构

  6. 常见Http访问错误小结

    4xx 客户端错误# 400 bad request 错误的请求 # 401 未携带身份信息 # 403 forbidden 权限不够 # 404 Not Found# 405 请求方式不允许 5xx ...

  7. CSS media queries 媒体查询

    最近在做一些页面打印时的特殊处理接触到了media queries,想系统学习一下,在MOZILLA DEVELOPER NETWORK看到一篇文章讲的很不错,结合自己的使用总结一下. CSS2/me ...

  8. Java分布式锁三种实现方案

    方案一:数据库乐观锁 乐观锁通常实现基于数据版本(version)的记录机制实现的,比如有一张红包表(t_bonus),有一个字段(left_count)记录礼物的剩余个数,用户每领取一个奖品,对应的 ...

  9. 织梦DedeCMS栏目列表常见序号的调用标签

    我们在制作dedecms模板时,源代码中的[field:global name=autoindex/]标签很好用可以调用数字序号,此标签最简单的用法就是按内容条数来获取数字序号,但有的时候发现使用该标 ...

  10. 图书管理系统UML建模

    图书管理系统UML建模 用例图 借阅者请求服务用例图 图书管理员处理借书还书用例图 系统管理员系统维护用例图 时序图 系统管理员添加书籍时序图 协作图 借阅者预留书籍协作图 状态图 书的状态图 活动图 ...