洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
归程
格式难调,题面就不放了。
分析:
之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$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]的更多相关文章
- 洛谷P4768 [NOI2018]归程(可持久化并查集,最短路)
闲话 一个蒟蒻,在网络同步赛上进行了这样的表演-- T2组合计数不会,T3字符串数据结构不会,于是爆肝T1 一开始以为整个地图都有车,然后写了2h+的树套树,终于发现样例过不去 然后写可持久化并查集D ...
- 洛谷 P4768 [NOI2018]归程
洛谷 361行代码的由来 数据分治大发好啊- NOI的签到题,可怜我在家打了一下午才搞了80分. 正解应该是kruskal重构树或排序+可持久化并查集. 我就分点来讲暴力80分做法吧(毕竟正解我也没太 ...
- [NOI2018] 归程 可持久化并查集
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个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重构树)
解法一: 1.首先想到离线做法:将边和询问从大到小排序,并查集维护连通块以及每个连通块中所有点到1号点的最短距离.$O(n\log n)$ 配合暴力等可以拿到75分. 2.很容易想到在线做法,使用可持 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- 洛谷P4768 [NOI2018]归程(克鲁斯卡尔重构树+最短路)
传送门 前置技能,克鲁斯卡尔重构树 我们按道路的高度建一个最大生成树,然后建好克鲁斯卡尔重构树 那么我们需要知道一颗子树内到1点距离最近是多少(除此之外到子树内任何一个点都不需要代价) 可以一开始直接 ...
- 洛谷$P4768\ [NOI2018]$归程 $kruscal$重构树
正解:$kruscal$重构树 解题报告: 传送门$QwQ$ 语文不好选手没有人权$TT$连题目都看不懂真的要哭了$kk$ 所以先放个题目大意?就说给定一个$n$个点,$m$条边的图,每条边有长度和海 ...
随机推荐
- C++构造函数和析构函数顺序
构造函数 先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决:构造函数的调用顺序总是如下:1.基类构造函数.如果有多个基类,则构造函数的调用顺 ...
- 阿里云ECS/Ubuntu下***浅析
公司项目中需要WebRTC作为即时通讯部分的核心技术,这部分的开发由我负责.实际上手前需要访问谷歌进行源码的下载以及编译,在这里记录下我各种折腾服务器***过程. 目前手上有两台阿里云ESC: 华南节 ...
- LightOJ 1065 - Number Sequence 矩阵快速幂水题
http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...
- SSO的几种跨域方案
在此只是记录一下自己在尝试SSO跨域实现的过程中学到的几种跨域方案,不包含任何例子和具体的实现方法. 最近在尝试SSO的跨域,看了好多资料,然后自己记录了一下可以实现的方法: ①跳转所有站点设置coo ...
- JVM学习二:JVM之类加载器之加载分析
前面一遍,我们对类的加载有了一个整体的认识,而这一节我们细节分析一下类加载器的第一步,即:加载. 一.概念 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区 ...
- 用setTimeout模拟QQ延时提示框
很简单的代码,不多解释,一看就懂. <!DOCTYPE html> <html> <head> <meta http-equiv="Content- ...
- hash(2018年CSUST省赛选拔赛第一场B题+hash+字典树)
题目链接:http://csustacm.com:4803/problem/1006 题目: 思路:正如题目一样,本题是一个hash,比赛的时候用的字典树,但是不知道为什么一直RE(听学长说要动态开点 ...
- laravel学习教程整理
百度传课:https://chuanke.baidu.com/v5847462-219167-1421398.html
- layui结合mybatis的pagehelper插件的分页通用的方法
总体思路: 1.前台查询的时候将当前页和页大小传到后台 2.后台将当前页,页大小以及数据与数据总数返回前台,前台显示完表格完数据之后显示分页插件. 前台页面: 准备查询条件的表单,与数据表格,分页di ...
- Linux SCIM/fcitx/ibus 输入法
现在很多发行版linux一般都是装好scim scim-tables-zh 重启就行 但有时重启后还是不能调用 可以用如下方法: 添加文件: sudo gedit /etc/X11/xinit/xin ...