[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程
[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程
题意
给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 \(v\) 和一个高度 \(h\), 鸭子德可以先无需花费地在高度大于 \(h\) 的边上任意行动, 然后可以在任意点开始以花费等于距离的模式行动. 问最小的花费.
\(|V|\le 2\times 10^5,|E|\le 4\times 10^5,q\le 4\times 10^5,h\le 10^9\).
题解
显然带花费部分的行动是一个单源最短路. 那么我们只要求出无花费部分的行动可以到达的点中哪一个点距离 \(1\) 最近就可以了.
发现无花费部分是个类似瓶颈路的问题, 我们可以在 Kruskal 重构树上倍增求出能到达的点所组成的子树, 输出这个子树中的点到 \(1\) 的最短距离就可以了.
为啥我要写这个裸题的题解呢?
一个原因是存板子, 另一个原因是这个沙雕强制在线把我卡掉了 \(3\) 分qaq...具体情况
参考代码
#include <bits/stdc++.h>
const int MAXV=4e5+10;
const int MAXE=1e6+10;
struct Edge{
int from;
int to;
int dis;
int pos;
Edge* next;
bool friend operator>(const Edge& a,const Edge& b){
return a.pos>b.pos;
}
};
Edge E[MAXE];
Edge Ex[MAXE];
Edge* head[MAXV];
Edge* top=E;
int v;
int e;
int q;
int n;
int k;
int maxv;
int dis[MAXV];
int pos[MAXV];
int ufs[MAXV];
bool vis[MAXV];
int pprt[20][MAXV];
int* prt=pprt[0];
int ReadInt();
void Kruskal();
int FindRoot(int);
void Dijkstra(int);
void Insert(int,int,int,int);
int main(){
int T=ReadInt();
while(T--){
memset(pprt,0,sizeof(pprt));
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
top=E;
n=v=ReadInt();
e=ReadInt();
for(int i=0;i<e;i++){
int a=ReadInt(),b=ReadInt(),c=ReadInt(),d=ReadInt();
Ex[i]=Edge({a,b,c,d,NULL});
Insert(a,b,c,d);
Insert(b,a,c,d);
}
q=ReadInt(),k=ReadInt(),maxv=ReadInt();
Dijkstra(1);
Kruskal();
int lg=0;
for(int i=1;(1<<i)<=v;i++){
lg=i;
for(int j=1;j<=v;j++)
pprt[i][j]=pprt[i-1][pprt[i-1][j]];
}
int lastans=0;
while(q--){
int s=(0ll+ReadInt()+k*lastans-1)%n+1,h=(0ll+ReadInt()+k*lastans)%(maxv+1);
for(int i=lg;i>=0;i--){
if(pos[pprt[i][s]]>h)
s=pprt[i][s];
}
printf("%d\n",lastans=dis[s]);
}
}
return 0;
}
void Kruskal(){
std::sort(Ex,Ex+e,std::greater<Edge>());
for(int i=1;i<=v;i++)
ufs[i]=i;
int& cur=v;
for(int i=0;i<e;i++){
int a=FindRoot(Ex[i].from);
int b=FindRoot(Ex[i].to);
if(a!=b){
++cur;
pos[cur]=Ex[i].pos;
dis[cur]=std::min(dis[a],dis[b]);
prt[a]=cur;
prt[b]=cur;
ufs[cur]=cur;
ufs[a]=cur;
ufs[b]=cur;
}
}
}
void Dijkstra(int s){
std::priority_queue<std::pair<int,int>> q;
memset(dis,0x7F,sizeof(dis));
dis[s]=0;
q.emplace(0,s);
while(!q.empty()){
s=q.top().second;
q.pop();
if(vis[s])
continue;
vis[s]=true;
for(Edge* i=head[s];i!=NULL;i=i->next){
if(dis[i->to]>dis[s]+i->dis){
dis[i->to]=dis[s]+i->dis;
q.emplace(-dis[i->to],i->to);
}
}
}
}
inline void Insert(int from,int to,int dis,int pos){
top->from=from;
top->to=to;
top->dis=dis;
top->pos=pos;
top->next=head[from];
head[from]=top++;
}
int FindRoot(int x){
return ufs[x]==x?ufs[x]:ufs[x]=FindRoot(ufs[x]);
}
inline int ReadInt(){
int x=0;
register char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch)){
x=x*10+ch-'0';
ch=getchar();
}
return x;
}

[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程的更多相关文章
- [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士
[LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士 题意 题面好啰嗦啊直接粘LOJ题面好了 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照 ...
- [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机
[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...
- [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会
[LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...
- [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分
[LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...
- [NOI 2018] 归程
Description 传送门 Solution 65分做法 先求出每个点到\(1\)号点的最短路,记为\(d[i]\).然后按照海拔从大到小依次加边,并查集维护每个连通块中\(d[i]\)的最小值, ...
- 解题:NOI 2018 归程
题面 清新友好的题目 跑一个最短路,然后对海拔建Kruskal重构树,从最后接上去的边(最低的一个)开始DFS一下处理子树里路程的最小值. 询问是每次在重构树上倍增找到深度最浅的海拔高于当天水位线的节 ...
- NOI 2018 归程 (Kruskal重构树)
题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...
- [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字
[LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...
- UOJ #449. 【集训队作业2018】喂鸽子
UOJ #449. [集训队作业2018]喂鸽子 小Z是养鸽子的人.一天,小Z给鸽子们喂玉米吃.一共有n只鸽子,小Z每秒会等概率选择一只鸽子并给他一粒玉米.一只鸽子饱了当且仅当它吃了的玉米粒数量\(≥ ...
随机推荐
- LVS 负载均衡——直接路由模式DR
一.配置的网络拓扑结构图 二.配置lvs服务器 配置虚拟网卡地址(VIP地址) [root@localhost ~]# ifconfig eno16777728: 192.168.200.253 ne ...
- isinstance和issubclass
目录 一.isinstance与type 二.issubclass 一.isinstance与type 在游戏项目中,我们会在每个接口验证客户端传过来的参数类型,如果验证不通过,返回给客户端" ...
- 使用paramiko模块进行封装,远程操作linux主机
import time import paramiko class HandleParamiko: ''' 定义一个linux处理类 ''' def __init__(self, hostname, ...
- EJB学习
EJB:企业级JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件. EJB主要有三种Bean: Session Beans: 会在单个特 ...
- ACL学习
H3C ACL主要有三种: 标准ACL: 2000-2999,基于源IP地址分配: 高级ACL:3000-3999,基于源目IP地址分配,报文优先级等三.四层信息: 二层ACL:4000-4999,基 ...
- PHPStorm使用PHP7新特性出现红色波浪错误
今天在项目中使用PHP7新特性时PHPStorm出现了如下红色错误,看着让人很不舒服,明明没有错 本地配置LNMP的PHP版本是7.2所以不是安装的PHP版本过低的问题,而是PHPStorm默认支持的 ...
- Mac设置su root密码
转自:https://blog.csdn.net/maxsky/article/details/44905003 大家都知道在 Linux 下,执行 su 命令后输入密码即可切换到 root 用户执 ...
- 史上最全Winform中使用ZedGraph教程与资源汇总整理(附资源下载)
场景 C#窗体应用中使用ZedGraph曲线插件绘制图表: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99716066 Win ...
- RiscV汇编介绍(2)-编译过程
elf文件全称是Executable and Linkable Format,可执行链接格式,elf文件中除了机器码之外,还有段加载地址,运行入口地址,数据段等. elf文件格式主要有以下三种: 可重 ...
- iOS安全攻防(一):Hack必备的命令与工具
转自:http://blog.csdn.net/yiyaaixuexi/article/details/8288077 你的应用正在被其他对手反向工程.跟踪和操作!你的应用是否依旧裸奔豪不防御? 郑重 ...