题目描述

本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定。 魔力之都可以抽象成一个 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. XTU1267:Highway(LCA+树的直径)

    传送门 题意 有n个小镇,Bobo想要建造n-1条边,并且如果在u到v建边,那么花费是u到v的最短路长度(原图),问你最大的花费. 分析 比赛的时候没做出来,QAQ 我们首先要找到树的直径起点和终点, ...

  2. Visual Studio 的Build Event 使用

    rmdir Configuration mkdir Configuration Copy "$(ProjectDir)Configuration\Spec.config" &quo ...

  3. bzoj 3573: [Hnoi2014]米特运输【树形dp+瞎搞】

    阅读理解题,题意是以1为根的有根树,每个点有点权,求修改最少点权能使每个点的权值等于其所有子节点权值之和并且每个点的所有子节点权值相等的个数 然后就比较简单了,就是有个技巧是数太大,需要对所有操作都取 ...

  4. SpringBoot 整合SpringMVC 原理探究

    https://blog.csdn.net/cml_blog/article/details/70196572 Spring Web MVC 的配置 Bean :WebMvcProperties

  5. A.华华听月月唱歌

    链接:https://ac.nowcoder.com/acm/contest/392/A 题意: 月月唱歌超级好听的说!华华听说月月在某个网站发布了自己唱的歌曲,于是把完整的歌曲下载到了U盘里.然而华 ...

  6. BZOJ4653(区间离散化+线段树+决策单调尺取)

    写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按 ...

  7. Codeforces Round #410 (Div. 2) C

    Description Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the sequence B = [b1 ...

  8. 160 Intersection of Two Linked Lists 相交链表

    编写一个程序,找到两个单链表相交的起始节点.例如,下面的两个链表:A:           a1 → a2                            ↘                   ...

  9. AO-XXXX

    一 AO4419:应用于开关应用或PWM应用的场效应管.

  10. javaFx 学习笔记

    1.每个javaFx程序定义在一个继承自javafx.application.Application的类中 Button:用于设置一个按钮,Button btOK = new Button(" ...