BZOJ5415 [NOI2018] 归程
今天也要踏上归程了呢~(题外话
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] 归程的更多相关文章
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- 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 ...
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路
BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...
- 题解 NOI2018 归程
题解 NOI2018 归程 题意 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l, ...
- [NOI2018]归程(kruscal重构树)
[NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...
- [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)
[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...
随机推荐
- BZOJ 1492: [NOI2007]货币兑换Cash 斜率优化 + splay动态维护凸包
Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券(以下简称A券)和 B纪念券(以下 简称B券).每个持有金券的顾客都有一个自己的帐户.金券的数目可以是一个 ...
- discuz x3.2设置注册邮件激活_企业邮箱发送邮件失败
在discuz x2.5邮箱设置里面已经说了很多关于邮件设置和常见问题的处理办法了,今天这里主要是说明下Discuz! 邮件发送失败排查思路,适用于任何板块的Discuz程序. Discuz! 邮件发 ...
- 【CF1243B2】Character Swap (Hard Version)【思维】
题意:给定两个字符串,问是否存在交换方案使得两个字符串相同,方案为交换次数小于等于2n,且每次只交换s1与s2中的一个字符 题解:考虑从前往后枚举,当第i位不同时,考虑找后边的第j位,若存在这样的第j ...
- 前端工具【0】—— Emmet插件
介绍:Emmet是许多流行文本编辑器的插件,它极大地改进了HTML和CSS工作流程 .为大部分流行的编辑器都提供了安装插件,核心是缩写语法+tab键(不同编辑器可自行设置),以下是我整理的常用知识点. ...
- pycharm默认的模板修改python script
#!/usr/bin/env python # encoding: utf-8 #set( $SITE = "https://www.cnblogs.com/c-x-a" ) &q ...
- 1.安装TypeScrpit
https://www.tslang.cn/index.html 1.vs安装 之前网上的查的安装方法是先安装nodejs,之后执行 npm install -g typescript 但是从官网的下 ...
- PHP-密码和token
密码 直接 md5 和 sha1 不安全!!! crypt() 和 hash_equals(): http://php.net/manual/zh/function.crypt.php <?ph ...
- 让Debian以root登录
Debian默认不允许root登录,所以修改之. (1)让Debian以root登录 修改gdm3的登录pam文件 #vi /etc/pam.d/gdm3 将auth required pam_suc ...
- 线程休眠只会用 Thread.sleep?来,教你新姿势!
线程休眠是 Java 开发经常会用到的一个手段,就是让当前线程睡一会儿,睡醒之后再继续运行. 咱大多数程序员,多线程虽然学得不好,但线程休眠,无人不知,无人不晓,也都会用,不就是用 Thread.sl ...
- Spring Boot静态资源
1.4 SpringBoot静态资源 1.4.1 默认静态资源映射 Spring Boot 对静态资源映射提供了默认配置 Spring Boot 默认将 /** 所有访问映射到以下目录: classp ...