Codeforces 787D Legacy 线段树 最短路
题意:
有\(n(1 \leq n \leq 10^5)\)个点,\(q(1 \leq q \leq 10^5)\)条路和起点\(s\)
路有三种类型:
- 从点\(v\)到点\(u\)需要花费\(w\)
- 从点\(v\)到区间\([l,r]\)中的点花费为\(w\)
- 从区间\([l,r]\)中的点到点\(v\)花费为\(w\)
求起点到各个点的最少花费
分析:
如下图,构建两颗线段树,边的花费都为\(0\)
对于第一种路直接加边即可
对于第二种路,添加从\(v\)到上面线段树对应区间中的点的边
对于第三种路,添加从下面线段树对应区间中的点到\(v\)的边

最后直接跑最短路
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <string>
#include <queue>
using namespace std;
#define REP(i, a, b) for(int i = a; i < b; i++)
#define PER(i, a, b) for(int i = b - 1; i >= a; i--)
#define SZ(a) ((int)a.size())
#define MP make_pair
#define PB push_back
#define EB emplace_back
#define ALL(a) a.begin(), a.end()
typedef long long LL;
typedef pair<LL, int> PII;
const int maxn = 100000 + 10;
int n, q, s;
struct Edge {
int v, w, nxt;
Edge() {}
Edge(int v, int w, int nxt): v(v), w(w), nxt(nxt) {}
};
int ecnt, head[maxn * 9];
Edge edges[maxn * 36];
void AddEdge(int u, int v, int w) {
printf("%d->%d, w = %d\n", u, v, w);
edges[ecnt] = Edge(v, w, head[u]);
head[u] = ecnt++;
}
int tot, T[2][maxn << 2];
void build(int t, int o, int L, int R) {
T[t][o] = ++tot;
if(L == R) {
if(0 == t) AddEdge(T[t][o], L, 0);
else AddEdge(L, T[t][o], 0);
return;
}
int M = (L + R) / 2;
build(t, o<<1, L, M);
build(t, o<<1|1, M+1, R);
if(0 == t) {
AddEdge(T[t][o], T[t][o<<1], 0);
AddEdge(T[t][o], T[t][o<<1|1], 0);
} else {
AddEdge(T[t][o<<1], T[t][o], 0);
AddEdge(T[t][o<<1|1], T[t][o], 0);
}
}
int type, v, qL, qR, w;
void update(int o, int L, int R) {
if(qL <= L && R <= qR) {
if(0 == type) AddEdge(v, T[type][o], w);
else AddEdge(T[type][o], v, w);
return;
}
int M = (L + R) / 2;
if(qL <= M) update(o<<1, L, M);
if(qR > M) update(o<<1|1, M+1, R);
}
const LL INF = 0x3f3f3f3f3f3f3f3f;
bool vis[maxn * 9];
LL d[maxn * 9];
priority_queue<PII, vector<PII>, greater<PII> > Q;
void dijkstra() {
memset(d, 0x3f, sizeof(d));
d[s] = 0;
Q.emplace(0, s);
while(!Q.empty()) {
PII t = Q.top(); Q.pop();
int& u = t.second;
if(vis[u]) continue;
vis[u] = true;
for(int i = head[u]; ~i; i = edges[i].nxt) {
int& v = edges[i].v;
int& w = edges[i].w;
if(d[v] > d[u] + w) {
d[v] = d[u] + w;
Q.emplace(d[v], v);
}
}
}
}
int main() {
scanf("%d%d%d", &n, &q, &s);
memset(head, -1, sizeof(head));
tot = n;
REP(t, 0, 2) build(t, 1, 1, n);
while(q--) {
scanf("%d%d%d", &type, &v, &qL);
if(type == 1) {
scanf("%d", &w);
AddEdge(v, qL, w);
} else {
type -= 2;
scanf("%d%d", &qR, &w);
update(1, 1, n);
}
}
dijkstra();
REP(i, 1, n + 1) printf("%lld ", d[i] == INF ? -1 : d[i]);
printf("\n");
return 0;
}
Codeforces 787D Legacy 线段树 最短路的更多相关文章
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- codeforces 787D - Legacy 线段树优化建图,最短路
题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...
- Codeforces.786B.Legacy(线段树优化建图 最短路Dijkstra)
题目链接 \(Description\) 有\(n\)个点.你有\(Q\)种项目可以选择(边都是有向边,每次给定\(t,u,v/lr,w\)): t==1,建一条\(u\to v\)的边,花费\(w\ ...
- CodeForces - 786B Legacy (线段树+DIjkstra+思维)
题意:给N个点和Q条选项,有三种类型的选项:1.从u到v花费w修建一条路:2.从u到下标区间为[L,R]的点花费w修建一条路; 3.从下标区间为[L,R]的点到u花费w修建一条路. 然后求起点s到其余 ...
- Codeforces 786B. Legacy 线段树+spfa
题目大意: 给定一个\(n\)的点的图.求\(s\)到所有点的最短路 边的给定方式有三种: \(u \to v\) \(u \to [l,r]\) \([l,r] \to v\) 设\(q\)为给定边 ...
- 786B - Legacy(线段树 + 最短路)线段树优化建图
题意: 就是给定一张n nn个点的图,求源点s ss到每个点的单源最短路.这张图共有q组边,连边方式有3种: a→b ,边权为w的单向边:a→[l,r] ,即a到连续区间[l,r]中的每一个点都有一条 ...
- Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- Codeforces Round #406 (Div. 2) D. Legacy 线段树建模+最短路
D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...
随机推荐
- 如何让MVC和多层架构和谐并存(一)
MVC的架构和多层架构,在ORM框架上是不兼容的.MVC的数据库操作需要通过实体框架Entity Framework,多层的数据库操作需要通过DAL层.我们最近刚完成的项目,实现了MVC和多层的并存, ...
- java,eclipse中如何添加httpclient.jar
1.Download 'Binary' package of the latest official release from the project download page. There sho ...
- Bloom Filter (海量数据处理)
什么是Bloom Filter 先来看这样一个爬虫相关问题:文件A中有10亿条URL,每条URL占用64字节,机器的内存限制是4G,现有一个URL,请判断它是否存在于文件A中(爬过的URL无需再爬). ...
- 解决频繁自动弹出“QQ拼音升级程序”,可使用旧版QQ输入法
QQ输入法(2017年9月6日版本)下载地址: http://dlc2.pconline.com.cn/filedown_90891_8506339/BZXMP3fp/QQPinyin_Setup_5 ...
- 是否应该提供一个dao.insertIgnoreNull ? (像updateIgnoreNull一样)
是否应该提供一个dao.insertIgnoreNull ? (像updateIgnoreNull一样) 发布于 406天前 作者 SayingCode 153 次浏览 复制 上一个帖子 ...
- CPU的段寄存器
http://www.cnblogs.com/tolimit/p/4775945.html?utm_source=tuicool&utm_medium=referral CPU的段寄存器 在C ...
- 2017.9.27 JavaWeb 属性的设置和获取
3.4.3新属性的设置和获取 对于getpParamter方法是通过参数传递获得数据, 设置数据的方法格式: void request.setAttribute("key",Ob ...
- 20145238-荆玉茗 《Java程序设计》第一周学习总结
20145238 <Java程序设计>第一周学习总结 教材学习内容总结 Java三大平台:由于java领域的应用越来越广,根据不同级别的应用开发区分了不同的应用版本,后正式更名为Java ...
- 预处理-04-#if defined和#if !defined
因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦. if defined 宏正是为 ...
- Linux---who命令学习
who命令 获取正在登录系统的用户 使用Linux的who命令 第一个参数book代表用户名,第二个参数tty7代表终端名,第三个参数代表时间,第四个参数代表用户的登录地址. 阅读手册 使用命令读手册 ...