洛谷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$条边的图,每条边有长度和海 ...
随机推荐
- Jugs(回溯法)
ZOJ Problem Set - 1005 Jugs Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge In ...
- [转]memmove、memcpy和memccpy
原文地址:http://www.cppblog.com/kang/archive/2009/04/05/78984.html 在原文基础上进行了一些小修改~ memmove.memcpy和memccp ...
- 【BZOJ4552】【HEOI2016】排序 [二分答案][线段树]
排序 Time Limit: 60 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在2016年,佳媛姐姐喜欢上了数字序列 ...
- 20155117王震宇 2006-2007-2 《Java程序设计》第5周学习总结
教材学习内容总结 try & catch java中的错误会被打包成对象,可以尝试(try)捕捉(catch)代表错误的对象后做一些处理.如果发生错误,会跳到catch的区块并执行. 异常结构 ...
- 搭建cdh单机版版本的hive所遇到的问题总汇
今天按照网上教程搭建了下 cdh 单机版的 hive 将相关配置记录下来 以便以后方便翻阅 版本 hive-0.13.1-cdh5.3.6.tar.gz 1. 直接解压 然后将 mysql驱动包 拷 ...
- 漫谈JWT
一.JWT简介[对于了解JWT的童鞋,可以直接跳到最后] 咱们就不弄那些乱七八糟的概念,就简单点说一下JWT是什么.有什么和能干什么 1. JWT概念和作用 JWT全称为json web token, ...
- 线程句柄和线程ID的区别
●CreateThread() API 用于创建线程. API 返回同时线程句柄,并通过参数得到线程标识符 (ID). 线程句柄有完全访问权创建线程对象. 运行线程时线程 ID 唯一标识线程在系统级别 ...
- css_input[checked]复选框去掉默认样式并添加新样式
效果对比: “\2713”实体符号√ :如有兴趣查看详细实体符号请点这里 代码实现: <!DOCTYPE html> <html> <head> <meta ...
- Django【设计】同功能不同实现模式的兼容性
需求: 当我们采集硬件信息时,客户端可以有多种方式,具体方式取决于客户机,CMDB项目中,我们有三种方式可选,AGENT/SSH/SALT,根据客户机具体情况和“SALT>>SSH> ...
- elk系列7之通过grok分析apache日志【转】
preface 说道分析日志,我们知道的采集方式有2种: 通过grok在logstash的filter里面过滤匹配. logstash --> redis --> python(py脚本过 ...