题目传送门

归程

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


  分析:

  之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$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. Linux改变用户shell的类型

    命令: 改变usr01的类型 # usermod -s /bin/csh usr01

  2. yum源的使用

    yum通过仓库拉取,同时解决了依赖的问题.有仓库的都是通过社区来维护的,不同的发行版会有不同的社区来维护 此时就是客户端和服务器的关系的问题了,yum会依赖一个配置文件, yum 的理念是使用一个中心 ...

  3. python 文字转语音包pyttsx安装出错解决方法

    pyttsx的python的文字转语音的包,但是pyttsx的官方网站上资源只更新2012年,所以在py3中使用pip install pyttsx或者下载安装包进行安装时,虽然可以安装成功,但是im ...

  4. new Date('2014/04/30') 和 new Date('2014-04-30') 的区别

    new Date('2014/04/30') Wed Apr 30 2014 00:00:00 GMT+0800 (中国标准时间) new Date('2014-04-30'); Wed Apr 30 ...

  5. Islands and Bridges(POJ2288+状压dp+Hamilton 回路)

    题目链接:http://poj.org/problem?id=2288 题目: 题意:求Hamilton 路径权值的最大值,且求出有多少条权值这么大的Hamilton路径. 思路:状压dp,dp[i] ...

  6. 牛客网习题剑指offer之数值的整数次方

    分析: 要考虑到exponent为0和负数的情况. 如果base是0并且exponent是负数的时候呢?那就发生除0的情况了. AC代码: public class Solution { public ...

  7. 数据类型的判断 --Object.prototype.toString.call(obj)精准检测对象类型

    数据类型的判断 typeof typeof返回一个表示数据类型的字符串,返回结果包括:number.boolean.string.symbol.object.undefined.function等7种 ...

  8. VC连接access

    (1)首先拷贝 c:\program files\common files\system\ado\ 目录中的 msado15.dll 文件到项目中. (2)在VC中加入DLL,具体方法如下: (3)创 ...

  9. Linux CGI编程基础【整理】

    Linux CGI编程基础 1.为什么使用CGI? 如前面所见,任何的HTML均是静态网页,它无法实现一些复杂的功能,而CGI可以为我们实现.如:a.列出服务器上某个目录中的文件,对目录中的文件进行操 ...

  10. 如何在Linux启动的时候执行一个命令

    在Linux启动起来时,执行一个命令的设置方法== 例如:需要执行的命令是cvslockd ============第一种方式:根据运行级别配置======================== 第一步 ...