题目: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. BZOJ 2428 JZYZOJ1533 : [HAOI2006]均分数据 模拟退火 随机化

    http://www.lydsy.com/JudgeOnline/problem.php?id=2428 http://172.20.6.3/Problem_Show.asp?id=1533 http ...

  2. ZOJ 3707 Calculate Prime S 数论

    思路:容易得到s[n]=s[n-1]+s[n-2],也就是fib数. 求第k小的fib质数的也就是第k个质数数-2,当k>2时. 在就是s[n]/x%m=s[n]%(x*m)/x. 代码如下: ...

  3. UESTC 2015dp专题 N 导弹拦截 dp

    导弹拦截 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descrip ...

  4. 使用本地的Nuget Repository加速Nuget访问速度

    Nuget是一个在VisualStudio下的非常好用的包管理器,然而由于众所周知的原因,其访问速度非常令人抓狂,甚至抽风.在没有VPN的环境下,如何解决这一问题呢?常见的解决方案是自己搭建一个Nug ...

  5. 升/降压转换器 (Buck-boost)

    升/降压转换器 (Buck-boost) 当输入电压是变动的,有时比输出电压高.有时却比较低时(例如放电中的电池),升/降压转换器 (Buck-boost) 是最佳的电源解决方案. 升/降压转换器 ( ...

  6. Redis事务为什么不支持回滚

    在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪.然而,这种行为也有其合理之处:只有当被调用的Redis命 ...

  7. The application’s PagerAdapter changed the adapter’s contents without calling PagerAdapter#notifyDa

    错误原因是在于修改了PageAdapter,却没有调用 PageAdapter的nodifyDataSetChanged方法.注意刷新数据 需要在主线程. 今天在做项目时出现了这个问题,一直报没有调用 ...

  8. Confman - 针对「Node 应用」的配置文件加载模块

    一句话介绍 confman 是一个强大的配置文件加载器,无论你喜欢 yaml .cson.json.properties.plist.ini.toml.xml 还是 js,都能满足你的愿望,并且更加简 ...

  9. XML 简单介绍

    先附上一张XML 大概图:详解见博客内容. 一.定义 XML(EXtensible Markup Language) :可扩展标记语言. 设计的用途:用来描述,存储,传输数据信息. 二.特色 1.单纯 ...

  10. C/C++调用java---JNI常用函数

    DefineClass         jclass  DefineClass(JNIEnv *env, jobject loader,  const jbyte *buf, jsize bufLen ...