题目传送门

归程

格式难调,题面就不放了。


  分析:

  之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做。

  但是之前做可持久化并查集的时候感觉掌握的并不熟,还是需要参照别人的题解,不过至少现在对可持久化的理解更深了一步,而且终于这题给调对了。

  Code:

//It is made by HolseLee on 23rd Aug 2018
//Luogu.org 4768
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
using namespace std; const int N=2e5+,M=8e5+,S=2e7+;
typedef unsigned int ui;
ui T,n,m,Q,K,s,lastans,L,cnt;
ui head[N],nxt[M],to[M],d[M],a[M],b[M],dis[N];
ui rt[M],lc[S],rc[S],dep[S],fa[S],mn[S];
bool vis[N];
struct Node{
ui id,val;
bool operator < (const Node x) const {
return val>x.val;
}
Node(ui x=,ui y=){
id=x,val=y;
}
};
struct Edge{
ui u,v,h;
bool operator < (const Edge x) const {
return h<x.h;
}
Edge(ui x=,ui y=,ui z=){
u=x,v=y,h=z;
}
}e[M];
priority_queue<Node> t; inline ui read()
{
char ch=getchar();ui num=;
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){
num=(num<<)+(num<<)+(ch^);ch=getchar();
}
return num;
} void build(ui &root,ui l,ui r)
{
root=++cnt;
if(l==r){mn[root]=dis[fa[root]=l];return;}
ui mid=(l+r)>>;
build(lc[root],l,mid);
build(rc[root],mid+,r);
} ui ins(ui *root,ui las,ui tag)
{
ui l=,r=n,mid;
while(l!=r){
*root=++cnt,mid=(l+r)>>;
if(tag<=mid)r=mid,rc[*root]=rc[las],root=lc+*root,las=lc[las];
else l=mid+,lc[*root]=lc[las],root=rc+*root,las=rc[las];
}
return *root=++cnt;
} ui find(ui root,ui tag)
{
ui now,l,r,mid;
while(){
now=root,l=,r=n;
while(l!=r){
mid=(l+r)>>;
if(tag<=mid)r=mid,now=lc[now];
else l=mid+,now=rc[now];
}
if(tag==fa[now])break;
tag=fa[now];
}
return now;
} int main()
{
T=read();
ui i,j;
while(T--){
n=read();m=read();
ui x,y,w,cnte=;cnt=;
for(i=;i<=m;++i){
x=read();y=read();
to[++cnte]=y,nxt[cnte]=head[x],head[x]=cnte;
to[++cnte]=x,nxt[cnte]=head[y],head[y]=cnte;
d[cnte]=d[cnte-]=read();
e[i]=Edge(x,y,a[cnte]=a[cnte-]=read());
}
memset(dis,-,(n+)<<);
dis[]=;t.push(Node(,));
while(!t.empty()){
Node now=t.top();t.pop();
if(vis[x=now.id])continue;
vis[x]=true;
for(i=head[x];i;i=nxt[i]){
y=to[i];
if(dis[y]>dis[x]+d[i])
t.push(Node(y,dis[y]=dis[x]+d[i]));
}
}
Q=read(),K=read(),s=read();lastans=;
sort(e+,e+m+);
for(i=;i<=m;++i)b[i]=e[i].h;
b[m+]=s+;
L=unique(b+,b+m+)-b-;
build(rt[L],,n);
for(i=L-,j=m;i;--i){
rt[i]=rt[i+];
for(;j&&e[j].h==b[i];--j){
if((x=find(rt[i],e[j].u))==(y=find(rt[i],e[j].v)))continue;
if(dep[x]>dep[y])swap(x,y);
fa[ins(&rt[i],rt[i],fa[x])]=fa[y];
w=ins(&rt[i],rt[i],fa[y]);
fa[w]=fa[y];mn[w]=Min(mn[x],mn[y]);
dep[w]=dep[y]+(dep[y]==dep[x]);
}
}
for(;Q;--Q){
x=(read()+K*lastans-)%n+;
y=(read()+K*lastans)%(s+);
printf("%u\n",lastans=mn[find(rt[upper_bound(b+,b+L+,y)-b],x)]);
}
memset(vis,,n+);
memset(head,,(n+)<<);
memset(rt,,(L+)<<);
memset(lc,,(cnt+)<<);
memset(rc,,(cnt+)<<);
memset(fa,,(cnt+)<<);
memset(mn,,(cnt+)<<);
memset(dep,,(cnt+)<<);
}
return ;
}

洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]的更多相关文章

  1. 洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)

    闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集D ...

  2. 洛谷 P4768 [NOI2018]归程

    洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...

  3. [NOI2018] 归程 可持久化并查集

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

  4. 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 ...

  5. [NOI2018]归程(可持久化并查集,Kruskal重构树)

    解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持 ...

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

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

  7. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  8. 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)

    传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...

  9. 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树

    正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...

随机推荐

  1. [DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法

    4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1目标定位 对象定位localization和目标检测detection 判断图像中的对象是不是汽车--Image clas ...

  2. echart图跟随屏幕自适应变化

    var myChart = echarts.init(document.getElementById('main'),'macarons');// var option = { //...一些配置 / ...

  3. mongodb角色权限

    角色说明:Read:允许用户读取指定数据库readWrite:允许用户读写指定数据库dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建.删除,查看统计或访问system.profileus ...

  4. NOIP2013 提高组 Day1

    https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...

  5. hadoop之存储篇

    ---持续更新中,可留言讨论--- --题目导航见页面左上角的悬浮框#目录导航#-- 一.目录: 集群规划 HDFS HA 冒烟测试 功能特性 二.集群规划: 负载类型 容量规划 可扩展性 角色分离 ...

  6. JVM学习十三:JVM之堆分析

    本章进入JVM学习的最后一节,此节主要分析的是堆,因为堆是JAVA程序中最常用使用到的地方,因此对这个地方有必要进行下细致的分析特别是OOM,言归正传,进入正文. 一.内存溢出(OOM)的原因 在JV ...

  7. HashSet的特性介绍

    HashSet除了在元素的存储上是无序的以外,还是不能够存储重复的元素. HashSet如何判断元素是否重复呢?是根据元素继承的两个方法来判断,hashCode和equals,当存储元素时,首先判断要 ...

  8. 天梯赛L2-008 最长对称子串 (字符串处理)

    对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...

  9. vue.js devtools-------调试vue.js的开发者插件

    vue.js devtools插件: 作用: 以往我们在进行测试代码的时候,直接在console进行查看,其实这个插件雷同于控制台,只不过在vue里面,将需要查看的数据存放在一个变量里面了~ 效果图: ...

  10. 服务器端包含 SSI简介

    服务器端包含 SSI,是英文 Server Side Includes的简写.SSI是一种可以指挥服务器动态声称网页内容的HTML指令. 通常SSI可以用来确保网页中的一些通用内容,比如版权信息.联系 ...