传送门

恰逢才做过VFK的A+B Problem,发现这道题也可以那样搞。区间连边的时候,我们就可以给那个区间在线段树对应的标号上连边。

线段树也可以不建出来,直接当做一个标号的合集,不占用内存,只用模拟在线段树上找区间的过程就可以了。

如果不清楚的话,可以看下A+B Problem的题解里面配有插图。

连好边之后就可以直接跑Dijkstra。

分析一下时间复杂度,线段树节点数是O(N)的,边数O(NlogN),所以算法复杂度为O(NlogN) 但是因为

#include <cstdio>
#include <cstring>
#define MAXN 200005
#define MAXM 5000005
#pragma comment(linker, "/STACK:102400000,102400000")
#define INF 0x3f3f3f3f3f3f3f3fLL
#define I64 long long
struct { int v, nxt, w; } e[MAXM << 1];
int Adj[MAXN * 6], c, n, L[MAXN], R[MAXN], N;
I64 C[MAXN];
inline void Add(int u, int v, I64 w) { ++ c; e[c].v = v; e[c].nxt = Adj[u]; e[c].w = w; Adj[u] = c; }
inline void GET(int &n) {
static char c; n = 0;
do c = getchar(); while('0' > c || c > '9');
do (n*=10)+=c-'0',c=getchar(); while('0' <= c && c <= '9');
}
inline void GET(I64 &n) {
static char c; n = 0;
do c = getchar(); while('0' > c || c > '9');
do (n*=10)+=c-'0',c=getchar(); while('0' <= c && c <= '9');
}
int LL, RR, F;
void Link(int i, int l, int r) {
if(LL > r || l > RR) return;
if(LL <= l && r <= RR) { Add(F, n + i, C[F]); return; }
int mid = (l + r) >> 1;
Link(i << 1, l, mid);
Link(i<<1|1, mid+1, r);
}
void Build(int i, int l, int r) {
if(l == r) { Add(n + i, l, 0); if(i + n > N) N = i+n; return; }
Add(i + n, n + (i << 1), 0); Add(n + i, n + (i << 1|1), 0);
int mid = (l + r) >> 1;
Build(i<<1, l, mid); Build(i<<1|1, mid+1, r);
}
/***************************************/
I64 dis[MAXN * 6];
int minp[MAXN * 12];
bool used[MAXN * 6];
inline void pushup(int p) {
int &r = minp[p];
r = p * !used[p];
if (dis[minp[p<<1]] < dis[r]) r = minp[p<<1];
if (dis[minp[p<<1|1]] < dis[r]) r = minp[p<<1|1];
}
void relax(int p, I64 d) {
if(d >= dis[p]) return;
dis[p] = d;
for(int i = p; i; i>>=1) pushup(i);
}
void finish(int p) {
used[p] = 1;
for(int i = p; i; i>>=1) pushup(i);
}
/***************以上这一段可以就当做堆优化**************/
void Dijkstra() {
for(int i = 0; i <= N; ++ i)
dis[i] = INF, used[i] = (minp[i] = 0);
relax(1, 0);
while(minp[1]) {
int u = minp[1];
finish(u);
for(int i = Adj[u]; i; i = e[i].nxt)
relax(e[i].v, dis[u] + (I64)e[i].w);
}
}
int main() {
int T; scanf("%d", &T);
while(T --) {
GET(n); c = N = 0; memset(Adj, 0, sizeof Adj);
for(int i = 1; i <= n; ++ i) GET(L[i]);
for(int i = 1; i <= n; ++ i) GET(R[i]);
for(int i = 1; i <= n; ++ i) GET(C[i]);
Build(1, 1, n);
for(int i = 1; i <= n; ++ i) {
LL = L[i]+i; RR = R[i]+i; F = i;
Link(1, 1, n);
RR = i-L[i]; LL = i-R[i];
Link(1, 1, n);
}
Dijkstra();
putchar('0');
for(int i = 2; i <= n; ++ i) printf(" %I64d", dis[i] == INF ? -1 : dis[i]);
puts("");
}
return 0;
}

HDU5361 In Touch(线段树 + 最短路)的更多相关文章

  1. Vijos 1404 遭遇战 - 动态规划 - 线段树 - 最短路 - 堆

    背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分子要炸掉藏在A区的SQC论坛服务器!我们SQC ...

  2. Codeforces787D(SummerTrainingDay06-D 线段树+最短路)

    D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  3. Codeforces 787D Legacy 线段树 最短路

    题意: 有\(n(1 \leq n \leq 10^5)\)个点,\(q(1 \leq q \leq 10^5)\)条路和起点\(s\) 路有三种类型: 从点\(v\)到点\(u\)需要花费\(w\) ...

  4. 786B - Legacy(线段树 + 最短路)线段树优化建图

    题意: 就是给定一张n nn个点的图,求源点s ss到每个点的单源最短路.这张图共有q组边,连边方式有3种: a→b ,边权为w的单向边:a→[l,r] ,即a到连续区间[l,r]中的每一个点都有一条 ...

  5. CodeForces786B 线段树 + 最短路

    给定n颗行星,q次处理,地球位置为s,求解在q次处理后,地球到每一颗行星的位置. 其中q有三种不同的操作: 输入v,u,wv,u,w,构建一条从vv到uu的代价为ww的路线 输入u,l,r,wu,l, ...

  6. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路

    B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...

  7. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  8. HDU5669 Road 分层最短路+线段树建图

    分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ​的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...

  9. 最短路 BZOJ3694 树链剖分+线段树

    分析: 树剖裸题,[Usaco2009 Jan]安全路经Travel 的简化版 剖开最短路树,遍历每一条没在最短路树上的边. 这种情况下,有且仅有u到v路径上,出来lca之外的点能够通过这条边到达,并 ...

随机推荐

  1. 使用新浪云 Java 环境搭建一个简单的微信处理后台

    前一段时间,写了一篇在新浪云上搭建自己的网站的教程,通过简单构建了一个 maven 的项目,展示部署的整个流程,具体的操作可以参看这里. 新浪云服务器除了可以搭建自己的网站以外,也非常的适合作为微信公 ...

  2. NPOI 2.0版本的使用

    详细教程: http://blog.csdn.net/xxs77ch/article/details/50216033 using System; using System.Collections.G ...

  3. otter双主同步安装与配置

    otter是阿里的开源数据同步项目,资源地址就不用说了哈,网上找,阿里云论坛关于单方向同步的配置已经很清楚了,理论上说,双主同步也不复杂,但是毕竟 是数据库,比较重要,配置双主的时候,总觉得心里没底, ...

  4. MySQL 数据库常用命令

    1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删除数据库,不提醒 show ...

  5. C#中的线程(一)入门

    文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中文翻译作者把原文放在了& ...

  6. NES模拟器开发-PPU笔记

    20151008 占坑,暂时没弄清楚PPU数据如何初始化,绘制顺序等.

  7. 关于实现Extjs动态加载类的方式实现

    Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...

  8. Javascript 截取2位小数

    今天在处理数据时,前台界面金额需要保留两位小数,所以只能使用Javascript 来进行截取. var regex = /([0-9]+\.[0-9]{2})[0-9]*/; var localMon ...

  9. .net多线程

    线程 线程池 异步 异步更新winform界面 线程同步

  10. CentOS6系统openssl生成证书和自签证书

    CentOS6系统openssl生成证书和自签证书的过程,记录一下,本文基于CentOS 6 64bit.$ yum install openssl openssl-devel 1,生成服务器端的私钥 ...