hdu5361(2015多校6)--In Touch(变形的dijkstra)

2024-08-25 00:38

本文主要是介绍hdu5361(2015多校6)--In Touch(变形的dijkstra),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:点击打开链接

题目大意:给出一个n个数的序列,标号为1到n,对于第i个数,它可以移动到距离i为[ li,ri ]的位置,花费为c[i],输入三行,第一行l[i],第二行r[i],第三行c[i],现在问对于第一个数来说,它移动到第i个位置的最小花费。(1<=i<=n)

这是一个每个点可以移动到一段中任意一个点,并且花费一样,这样就不适用与已有的四种最短路,但是可以对dijkstra进行变形,dij是每次找到一个距离最小的节点,用这个节点去更新其它节点,我们可以用一个优先队列,每次找到一个点,用这个点去更新其他的点,这个点要满足 dis[i]+c[i]是最小的,那么这个点更新出来的点也就是最小的。

有优先队列维护dis+c的值,用set来找到一段中还没有更新的点,这样就可以防止会遍历到已经更新好的点,造成超时。

#include <cstdio>
#include <cstring>
#include <queue>
#include <set>
#include <algorithm>
using namespace std ;
#define LL __int64
#pragma comment(linker, "/STACK:102400000,102400000")
struct node{int id ;LL c ;bool operator < (node a) const {return c > a.c ;}
} p , q ;
priority_queue<node> que ;
set<int> s ;
set<int> ::iterator iter ;
LL dis[200010] , c[200010] ;
int l[200010] , r[200010] ;
void f(int l,int r) {iter = s.lower_bound(l) ;while( iter != s.end() ) {if( *iter > r ) break ;dis[ *iter ] = p.c ;q.id = *iter ;q.c = p.c + c[ q.id ] ;que.push( q ) ;iter++ ;s.erase(q.id) ;}return ;
}
int main() {int t , n , i , x , y ;//freopen("1009.in","r",stdin) ;//freopen("111.out","w",stdout) ;scanf("%d", &t) ;while( t-- ) {while( !que.empty() ) que.pop() ;memset(dis,-1,sizeof(dis)) ;s.clear() ;scanf("%d", &n) ;for(i = 2 ; i <= n ; i++) s.insert(i) ;for(i = 1 ; i <= n ; i++) scanf("%d", &l[i]) ;for(i = 1 ; i <= n ; i++) scanf("%d", &r[i]) ;for(i = 1 ; i <= n ; i++) scanf("%I64d", &c[i]) ;dis[1] = 0 ;p.id = 1 ;p.c = c[1] ;que.push(p) ;while( !que.empty() && !s.empty() ) {p = que.top() ;que.pop() ;x = max(p.id - r[ p.id ],1) ;y = p.id - l[ p.id ] ;if( y >= 1 ) f(x,y) ;x = p.id + l[ p.id ] ;y = min(p.id + r[ p.id ],n) ;if( x <= n ) f(x,y) ;}for(i = 1 ; i < n ; i++)printf("%I64d ", dis[i]) ;printf("%I64d\n", dis[i]) ;}return 0 ;
}


这篇关于hdu5361(2015多校6)--In Touch(变形的dijkstra)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104063

相关文章

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu3389(阶梯博弈变形)

题意:有n个盒子,编号1----n,每个盒子内有一些小球(可以为空),选择一个盒子A,将A中的若干个球移到B中,满足条件B  < A;(A+B)%2=1;(A+B)%3=0 这是阶梯博弈的变形。 先介绍下阶梯博弈: 在一个阶梯有若干层,每层上放着一些小球,两名选手轮流选择一层上的若干(不能为0)小球从上往下移动,最后一次移动的胜出(最终状态小球都在地面上) 如上图所示,小球数目依次为

poj 1502 MPI Maelstrom(单源最短路dijkstra)

题目真是长得头疼,好多生词,给跪。 没啥好说的,英语大水逼。 借助字典尝试翻译了一下,水逼直译求不喷 Description: BIT他们的超级计算机最近交货了。(定语秀了一堆词汇那就省略吧再见) Valentine McKee的研究顾问Jack Swigert,要她来测试一下这个系统。 Valentine告诉Swigert:“因为阿波罗是一个分布式共享内存的机器,所以它的内存访问

uva 10801(乘电梯dijkstra)

题意: 给几个电梯,电梯0 ~ n-1分别可以到达很多层楼。 换乘电梯需要60s时间。 问从0层到target层最小的时间。 解析: 将进入第0层的电梯60s也算上,最后减。 坑点是如果target为0输出0。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algori

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

poj 3255 次短路(第k短路) A* + spfa 或 dijkstra

题意: 给一张无向图,求从1到n的次短路。 解析: A* + spfa 或者 dijkstra。 详解见上一题:http://blog.csdn.net/u013508213/article/details/46400189 本题,spfa中,stack超时,queue的效率最高,priority_queue次之。 代码: #include <iostream>#i

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

2015年校赛总结

题目名为“校赛总结”,其实更想换成“Rainbow为什么五题滚粗?!”。作为今年校赛大二没拆的两个队伍之一,结果打成这样,没脸见人了,总结起来就是我认为自己今天SB了。主要有以下几点: 1.我今天状态的确不好,最后卡的那道B题跟去年在农大校赛上遇见的那题类似,在最后那段时间我已经有思路了,可是由于当时不敢写。等到最后15分钟才开始敲,加上我用很麻烦的Dijstra那种方法,调试起来好多细节要处理

百度之星 2015 复赛 1001 (数长方形)

数长方形    Accepts: 595    Submissions: 1225  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊喜欢玩木棒。一天他在玩木棒的时候,发现一些木棒会形成长方形