题目描述

本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定。 魔力之都可以抽象成一个 n 个节点、m 条边的无向连通图(节点的编号从 1 至 n)。 我们依次用 l,a 描述一条边的长度、海拔。 作为季风气候的代表城市,魔力之都时常有雨水相伴,因此道路积水总是不可避免 的。由于整个城市的排水系统连通,因此有积水的边一定是 海拔相对最低的一些边。 我们用水位线来描述降雨的程度,它的意义是:所有海拔不超过水位线的边都是有积水的。

Yazid 是一名来自魔力之都的 OIer,刚参加完 ION2018 的他将踏上归程,回到他 温暖的家。 Yazid 的家恰好在魔力之都的 1 号节点。对于接下来 Q 天,每一天 Yazid 都会告 诉你他的出发点 v ,以及当天的水位线 p。 每一天,Yazid 在出发点都拥有一辆 . 车。这辆车由于一些故障不能经过有积水的边。 Yazid 可以在任意节点下车,这样接下来他就可以步行经过有积水的边。但车会被留在 他下车的节点并不会再被使用。 • 需要特殊说明的是,第二天车会被重置,这意味着: – 车会在新的出发点被准备好。 – Yazid 不能利用之前在某处停放的车。 Yazid 非常讨厌在雨天步行,因此他希望在完成回家这一目标的同时,最小化他步行经过的边的总长度。请你帮助 Yazid 进行计算。 本题的部分测试点将强制在线,具体细节请见【输入格式】和【子任务】。

上面是题目描述。

主要做法kruscal重构树,即在kruscal合并的时候新建一个父节点,点权为原边权,这样可以形成一个大(小)根堆。

然后两个点求lca可知最大边最小(最小边最大)。具体看程序。

代码:

#include<queue>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 400005
#define M 800005
inline int rd()
{
int f=,c=;char ch = getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=*c+ch-'';ch=getchar();}
return f*c;
}
struct Node
{
int u,v,l,a,nxt;
}w[M],e[*N];
struct Poi
{
int x,d;
Poi(){}
Poi(int x,int d):x(x),d(d){}
friend bool operator < (Poi a,Poi b)
{
return a.d>b.d;
}
};
bool cmp(Node n1,Node n2)
{
return n1.a>n2.a;
}
int T,n,m,ans,cnt,hed[N],q,k,s;
void ae(int f,int t,int l)
{
e[++cnt].u = f;
e[cnt].v = t;
e[cnt].l=l;
e[cnt].nxt = hed[f];
hed[f]=cnt;
}
int dis[N];
bool vis[N];
priority_queue<Poi>que;
void dij()
{
for(int i=;i<=n;i++)
{
dis[i]=0x3f3f3f3f;
vis[i]=;
}
dis[]=;
que.push(Poi(,));
while(!que.empty())
{
Poi tp = que.top();
que.pop();
int u = tp.x;
if(vis[u])continue;
vis[u]=;
for(int j=hed[u];j;j=e[j].nxt)
{
int to = e[j].v;
if(dis[to]>dis[u]+e[j].l)
{
dis[to]=dis[u]+e[j].l;
que.push(Poi(to,dis[to]));
}
}
}
}
int fa[*N][],ff[*N],vl[*N],min_dis[*N],tot;
int findfa(int x)
{
return ff[x]==x?x:ff[x]=findfa(ff[x]);
}
void kruskal()
{
int ad = ;
tot = n;
for(int i=;i<=n;i++)
{
min_dis[i]=dis[i];
ff[i]=i;
}
for(int i=;ad<n-;i++)
{
int u = w[i].u;
int v = w[i].v;
if(findfa(u)!=findfa(v))
{
ad++;
tot++;
fa[ff[u]][]=tot;
fa[ff[v]][]=tot;
min_dis[tot]=min(min_dis[ff[u]],min_dis[ff[v]]);
vl[tot]=w[i].a;
ff[tot]=tot;
ff[ff[u]]=tot;
ff[ff[v]]=tot;
}
}
}
int main()
{
T=rd();
while(T--)
{
n=rd(),m=rd(),ans=;
for(int i=;i<=n;i++)hed[i]=;
cnt=;
for(int i=;i<=m;i++)
{
w[i].u=rd(),w[i].v=rd(),w[i].l=rd(),w[i].a=rd();
ae(w[i].u,w[i].v,w[i].l);
ae(w[i].v,w[i].u,w[i].l);
}
dij();
sort(w+,w++m,cmp);
kruskal();
for(int j=;j<=;j++)
{
for(int i=;i<=tot;i++)
{
fa[i][j]=fa[fa[i][j-]][j-];
}
}
q=rd(),k=rd(),s=rd();
int v,p;
for(int i=;i<=q;i++)
{
v = (rd()+k*ans-)%n+;
p = (rd()+k*ans)%(s+);
ans=dis[v];
for(int j=;j>=;j--)
{
if(vl[fa[v][j]]>p)
{
ans=min_dis[fa[v][j]];
v=fa[v][j];
}
}
printf("%d\n",ans);
}
}
return ;
}

NOI2018_Day1_T1_归程的更多相关文章

  1. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

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

  2. LG4768 [NOI2018]归程

    题意 题目背景 本题因为一些原因只能评测16组数据. 剩下的四组数据:https://www.luogu.org/problemnew/show/U31655 题目描述 本题的故事发生在魔力之都,在这 ...

  3. [NOI2018]归程 kruskal重构树

    [NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...

  4. loj#2718. 「NOI2018」归程

    题目链接 loj#2718. 「NOI2018」归程 题解 按照高度做克鲁斯卡尔重构树 那么对于询问倍增找到当前点能到达的高度最小可行点,该点的子树就是能到达的联通快,维护子树中到1节点的最短距离 s ...

  5. 【BZOJ5415】【NOI2018】归程(克鲁斯卡尔重构树)

    [NOI2018]归程(克鲁斯卡尔重构树) 题面 洛谷 题解 我在现场竟然没有把这道傻逼题给切掉,身败名裂. 因为这题就是克鲁斯卡尔重构树的模板题啊 我就直接简单的说一下把 首先发现答案就是在只经过海 ...

  6. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

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

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

  8. 「NOI2018」归程

    「NOI2018」归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 >\(1\) 个节点. \(m\) 条边的无向连通图(节点的编号从 \( ...

  9. NOI2018 D1T1 [NOI2018]归程 解题报告

    P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...

随机推荐

  1. bzoj 5210: 最大连通子块和【动态dp+树剖+线段树+堆】

    参考:https://www.cnblogs.com/CQzhangyu/p/8632904.html 要开longlong的 首先看dp,设f[u]为必选u点的子树内最大联通块,p[u]为不一定选u ...

  2. pip 国内安装镜像源

    转自: https://blog.csdn.net/xuezhangjun0121/article/details/81664260 pip国内的一些镜像   阿里云 http://mirrors.a ...

  3. TCP协议深度刨析

    这篇文章主要是详细说明TCP的拥塞控制,因为它对于我们理解整个TCP/IP协议栈非常重要,但我个人能力有限,其中引用了很多网上其他博主的文章,在下文引用处都有说明,主要是让整篇文章能够连贯,不至于让所 ...

  4. 51Nod 1013 3的幂的和(快速幂+逆元)

    #include <iostream> #include <algorithm> #include <string> #define MOD 1000000007 ...

  5. iOS 跷跷板动画 Seesaw Animation

    Xcode Playgound示例代码: let testView = UIView() testView.frame = CGRect.init(x: , y: , width: , height: ...

  6. 使用c++的一些建议

    1: 不要使用宏,用const或enum定义常量 用inline避免函数的额外调用(使用inline的函数,块里面尽量不要使用循环和递归) 用template去荷花一些函数或者类型 用namespac ...

  7. socket_IO模型

    1 背景知识 1.1 用户空间和内核空间 比如32位系统,寻址空间是4G.内存分为用户空间和内核空间,内核空间仅供内核使用,用户空间给各个进程使用.os的核心是内核,只有内核可以访问被保护的内存空间. ...

  8. Testing Round #12 C

    Description For the given sequence with n different elements find the number of increasing subsequen ...

  9. android动画(2)自定义动画

    public class CustomAnimation extends Animation { // 这个方法可以获得动画view的width,height,以及它父view的width @Over ...

  10. 对protected修饰符的范围用代码说明(同时说明用protected修饰的属性,在继承时,一定程度上破坏了封装)

    目录结构: 本类: 本包: 子孙类: 其他包: