NOI2018_Day1_T1_归程
题目描述
本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定。 魔力之都可以抽象成一个 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_归程的更多相关文章
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- LG4768 [NOI2018]归程
题意 题目背景 本题因为一些原因只能评测16组数据. 剩下的四组数据:https://www.luogu.org/problemnew/show/U31655 题目描述 本题的故事发生在魔力之都,在这 ...
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- loj#2718. 「NOI2018」归程
题目链接 loj#2718. 「NOI2018」归程 题解 按照高度做克鲁斯卡尔重构树 那么对于询问倍增找到当前点能到达的高度最小可行点,该点的子树就是能到达的联通快,维护子树中到1节点的最短距离 s ...
- 【BZOJ5415】【NOI2018】归程(克鲁斯卡尔重构树)
[NOI2018]归程(克鲁斯卡尔重构树) 题面 洛谷 题解 我在现场竟然没有把这道傻逼题给切掉,身败名裂. 因为这题就是克鲁斯卡尔重构树的模板题啊 我就直接简单的说一下把 首先发现答案就是在只经过海 ...
- 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- 「NOI2018」归程
「NOI2018」归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 >\(1\) 个节点. \(m\) 条边的无向连通图(节点的编号从 \( ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
随机推荐
- iOS开发检测是否开启定位、是否允许消息推送等权限
1.iOS开发检测是否开启定位: 需要导入: #import <CoreLocation/CoreLocation.h> 代码如下: + (void)openLocationService ...
- POJ1787 【完全背包+物品计数+路径输出】
题意: 有1,5,10,25四种硬币,给每种硬币的数量和要组合成的价值,求刚好达到价值时用的硬币最多,然后还要输出具体的用的数量 前言: 一开始是偶然看见了kuangbin爷的题解说是完全背包+路径, ...
- NOIp 2015信息传递【tarjan/拓扑/并查集】
一道好的NOIp题目,在赛场上总能用许多算法A掉.比如这道和关押罪犯. 题目传送门 法一:tarjan在有向图中跑最小环 有人从别人口中得知自己信息,等效于出现了一个环.于是 这就变成了一个有向图ta ...
- 最小公倍数的最小和(Minimum Sum LCM )
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> u ...
- iOS Swift3 用全局“宏”时要注意的问题
当你需要定义一个APP全局“宏”来调用 UserDefaults.standard里存储的值的时候, 一定要将这个“宏”定义为计算属性,否则你得到的值只会在APP启动的时候计算一次. 示例如下: va ...
- IDEA远程调试hadoop程序
远程调试Hadoop各组件 Hadoop学习之配置Eclipse远程调试Hadoop IDEA远程调试hadoop Hadoop 研发之远程调试详细剖析--WordCount V2.0 eclipse ...
- Codeforces 1107E(区间dp)
用solve(l, r, prefix)代表区间l开始r结束.带了prefix个前缀str[l](即l前面的串化简完压缩成prefix-1个str[l],加上str[l]共有prefix个)的最大值. ...
- Monitor CodeForces - 846D
题目 题意:有一个n*m的显示屏,有q个坏点先后出现,已知第i个坏点位置为(xi,yi),在ti时间出现.显示屏上出现一个k*k的矩阵全都是坏点时显示屏就是坏的.输出显示屏坏的时间,如果不会坏就输出- ...
- oracle中的用户详解 【转】
oracle中的用户很多,也很令初学者费解.oracle中的帐户分为两类:一类是必需的帐户,一类是存储各种应用的帐户 用户名 密码 描述 ANONYMOUS ANONYMOUS 访问http的匿名 ...
- 机器学习概念之特征处理(Feature processing)
不多说,直接上干货! 肯定也有不少博友,跟我一样,刚开始接触的时候,会对这三个概念混淆. 以下是,特征处理.特征提取.特征转换和特征选择的区别! 特征处理主要包含三个方面:特征提取.特征转换和特征选择 ...