【题解】Codeforces 786B Legacy

博客详细解析了Codeforces 786B Legacy问题,指出暴力解法不可行,并提出利用线段树和图论建模结合最短路算法的解决方案。通过建立两棵线段树来处理不同类型的边,然后进行最短路计算,以解决有向边的连接问题。样例输入和输出帮助理解题意,配合示意图辅助理解算法实现。
摘要由CSDN通过智能技术生成

传送门
题目意思很简单,就是你有三种操作:
1 u v w 从u向v连一条权值为w的有向边
2 u L R w 从u向L至R的所有结点连一条权值为w的有向边
3 u L R w 从L至R的所有结点向u连一条权值为w的有向边
首先看到题目,马上就明白不是暴力能够解决的事情(毕竟人家是Div.1的B啊),但是看到L和R,正常人应该都会往线段树这里想一想。没错,标算就是线段树图论建模+最短路。
由于连的是有向边,一棵线段树可能难以满足我们的要求,那就建两棵线段树吧。
举个例子:


样例输入:
4 3 1
3 4 1 3 1
2 1 2 4 2
1 2 3 3
样例输出:
0 2 2 1


样例解释:
你有三个操作,首先由[1, 3]中所有结点向4号结点连一条权值为1的有向边
其次,从1号结点出发向[2, 4]中左右结点连一条权值为2的有向边,最后,从2到3连一条权值为1的有向边。
写贴一个亲自画的图~
这里写图片描述
看到这张图应该就比较清晰了,给1和2两个操作分别建一棵线段树,加边(具体解释起来有点麻烦,贴代码的时候写写注释解释一下),然后就能很清晰的看到一个图论的模型,然后跑一遍最短路就可以啦~

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define N 100010
#define M 300110
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值