题目:http://acm.hdu.edu.cn/showproblem.php?pid=5361

题意:最短路。求源点到全部点的最短距离。但与普通最短路不同的是,给出的边是某点到区间[l,r]内随意点的距离。

输入一个n,代表n个点,输入n个l[i],输入n个r[i],输入n个c[i]。

对于i,表示i到区间[i - r[i]],i - l[i]]和区间[i + l[i],i + r[i]]内的随意点的距离为c[i]。

求1到各个点的最短距离。

思路:若建边跑最短路的话,由于边过多,所以不可行。

由于在最后的结果中。可能源点1到某段区间的最短路径都是一样的,所以能够在最短路的算法基础上利用线段树区间更新来维护源点1到区间的最短路径,最后仅仅须要查询区间就可以。线段树的每一个结点存该区间源点到该区间点的最短路的最大值和最小值。

所以叶子结点即是源点1到该点的最短路径。(思路来源队友)

代码:

#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <string.h>
#include <math.h>
#include <queue>
#include <set>
#include <vector>
#include <algorithm> using namespace std; #define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1 const long long INF = 1e18;
const int N = 2e5 + 10; struct Segment {
int l, r;
long long d; Segment(int l = 0, int r = 0, long long d = 0) {
this -> l = l;
this -> r = r;
this -> d = d;
} friend bool operator < (Segment a, Segment b) {
return a.d > b.d;
}
}; struct Node {
int used;//标记该段区间是否使用过。由于距离均为正值,所以若该区间已是最短距离,则不须要继续更新。
long long _max;
long long _min;
}; Node node[N << 2];
long long lazy[N << 2];
int n;
int lef[N];
int rig[N];
long long c[N];
priority_queue<Segment> q; void pushup(int rt) {
node[rt]._max = max(node[rt << 1]._max, node[rt << 1 | 1]._max);
node[rt]._min = min(node[rt << 1]._min, node[rt << 1 | 1]._min);
if (node[rt << 1].used == node[rt << 1 | 1].used)
node[rt].used = node[rt << 1].used;
else
node[rt].used = -1;
} void pushdown(int rt) {
if (lazy[rt] != -1) {
lazy[rt << 1] = lazy[rt << 1 | 1] = lazy[rt];
node[rt << 1]._min = node[rt << 1]._max = lazy[rt];
node[rt << 1 | 1]._min = node[rt << 1 | 1]._max = lazy[rt];
lazy[rt] = -1;
}
} void build(int l, int r, int rt) {
node[rt]._max = INF;
node[rt]._min = INF;
node[rt].used = 0;
lazy[rt] = -1;
if (l == r) {
if (l == 1) {
node[rt]._max = 0;
node[rt]._min = 0;
}
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
pushup(rt);
} void update(long long cr, int L, int R, int l, int r, int rt) {
if (node[rt]._max <= cr)
return ;
if (L <= l && r <= R) {
node[rt]._max = cr;
if (node[rt]._min > cr) {
node[rt]._min = cr;
q.push(Segment(l, r, cr));
lazy[rt] = cr;
return ;
}
}
if (l == r)
return ;
pushdown(rt);
int m = (l + r) >> 1;
if (L <= m)
update(cr, L, R, lson);
if (R > m)
update(cr, L, R, rson);
pushup(rt);
} void querysegment(Segment ff, int l, int r, int rt) {
if (node[rt].used == 1)
return ;
if (ff.l <= l && r <= ff.r) {
if (node[rt].used == 0) {
for (int i = l; i <= r; i++) {
int le = i + lef[i];
int ri = min(n, i + rig[i]);
if (le <= n) {
update(ff.d + c[i], le, ri, 1, n, 1);
}
le = max(1, i - rig[i]);
ri = i - lef[i];
if (ri >= 1) {
update(ff.d + c[i], le, ri, 1, n, 1);
}
}
node[rt].used = 1;
return ;
}
}
if (l == r)
return ;
int m = (l + r) >> 1;
if (ff.l <= m)
querysegment(ff, lson);
if (ff.r > m)
querysegment(ff, rson);
pushup(rt);
} bool fir;
void query(int l, int r, int rt) {
if (node[rt]._max == node[rt]._min) {
for (int i = l; i <= r; i++) {
if (node[rt]._min == INF)
node[rt]._min = -1;
if (!fir) {
printf("%lld", node[rt]._min);
fir = true;
}
else
printf(" %lld", node[rt]._min);
}
return ;
}
if (l == r) {
return ;
}
pushdown(rt);
int m = (l + r) >> 1;
query(lson);
query(rson);
} int main() { int t_case;
scanf("%d", &t_case);
for (int i_case = 1; i_case <= t_case; i_case++) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &lef[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &rig[i]);
for (int i = 1; i <= n; i++)
scanf("%lld", &c[i]);
build(1, n, 1);
while(!q.empty())
q.pop(); q.push(Segment(1, 1, 0));
while (!q.empty()) {
Segment ff = q.top();
q.pop();
querysegment(ff, 1, n, 1);
} fir = false;
query(1, n, 1);
printf("\n");
}
return 0;
}

HDU 5361 In Touch (2015 多校6 1009 最短路 + 区间更新)的更多相关文章

  1. Hdu 5361 In Touch (dijkatrs+优先队列)

    题目链接: Hdu 5361  In Touch 题目描述: 有n个传送机排成一排,编号从1到n,每个传送机都可以把自己位置的东西传送到距离自己[l, r]距离的位置,并且花费c,问从1号传送机到其他 ...

  2. HDU 4704 Sum (2013多校10,1009题)

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submi ...

  3. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  4. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. 2015 Multi-University Training Contest 6 hdu 5361 In Touch

    In Touch Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  6. HDU 5301 Buildings(2015多校第二场)

    Buildings Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  7. hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 题意:F(x) 表示x的不同质因子的个数结果是求L,R区间中最大的gcd( F(i) , F(j ...

  8. hdu 5316 Magician(2015多校第三场第1题)线段树单点更新+区间合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5316 题意:给你n个点,m个操作,每次操作有3个整数t,a,b,t表示操作类型,当t=1时讲a点的值改 ...

  9. hdu 5305 Friends(2015多校第二场第6题)记忆化搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给你n个人,m条关系,关系可以是online也可以是offline,让你求在保证所有人on ...

随机推荐

  1. [CSAcademy]A-Game

    题目大意: 给你一个只含字符'A'和'B'的串,A和B两人轮流对其中的子串染色,要求被染色的子串中不包含已经被染色的子串. 最后,如果一方染的'A'少,那么这一方胜: 如果双方染的'A'和'B'一样多 ...

  2. 【BZOJ】2724: [Violet 6]蒲公英

    2724: [Violet 6]蒲公英 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2900  Solved: 1031[Submit][Statu ...

  3. Codeforces Beta Round #10 D. LCIS 动态规划

    D. LCIS 题目连接: http://www.codeforces.com/contest/10/problem/D Description This problem differs from o ...

  4. Codeforces Round #303 (Div. 2) D. Queue 傻逼题

    C. Woodcutters Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/545/probl ...

  5. C#获取picturebox图片路径

    path = ofd.FileName; filename = ofd.SafeFileName; lu="E:\\鹿瑶\\Csharp\\DB学生报名系统\\baomingDemo\\bi ...

  6. bosondata/chrome-prerender: Render JavaScript-rendered page as HTML/PDF/mhtml/png/jpeg using headless Chrome

    bosondata/chrome-prerender: Render JavaScript-rendered page as HTML/PDF/mhtml/png/jpeg using headles ...

  7. ExtJS ComboBox同时加载远程和本地数据

    ExtJS ComboBox同时加载远程和本地数据 原文:http://gblog.hbcf.net/index.php/archives/233 ComboBox比较特殊需求,将远程数据和本地数据同 ...

  8. objectiveC【语法】修饰符 static extern const

    const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变. NSString * c ...

  9. 阿里云+django实战记录

    2013年7月13日10:36:53:接上篇,bae部署django没成功,转战阿里云.. 阿里云服务器最便宜69/月,现在有个活动,新用户送20元现金券,我就花了RMB 49买了一个,操作系统选的是 ...

  10. java socket 长连接 短连接

    长连接 是一旦一个客户端登陆上服务器,其与服务器之间的连接就不关闭,不管他们之间进行了多少次交易,直到客户端退出登陆或网络出现故障.这种技术在联机交易系统实现有利于提高效率. 短连接是客户端每发一个请 ...