HDu 5361
来源:互联网 发布:数据库分组查询统计 编辑:程序博客网 时间:2024/06/08 10:54
In Touch
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1609 Accepted Submission(s): 435
Problem Description
There are n soda living in a straight line. soda are numbered by 1,2,…,n from left to right. The distance between two adjacent soda is 1 meter. Every soda has a teleporter. The teleporter of i -th soda can teleport to the soda whose distance between i -th soda is no less than li and no larger than ri . The cost to use i -th soda's teleporter is ci .
The1 -st soda is their leader and he wants to know the minimum cost needed to reach i -th soda (1≤i≤n) .
The
Input
There are multiple test cases. The first line of input contains an integer T , indicating the number of test cases. For each test case:
The first line contains an integern (1≤n≤2×105) , the number of soda.
The second line containsn integers l1,l2,…,ln . The third line contains n integers r1,r2,…,rn . The fourth line contains n integers c1,c2,…,cn . (0≤li≤ri≤n,1≤ci≤109)
The first line contains an integer
The second line contains
Output
For each case, output n integers where i -th integer denotes the minimum cost needed to reach i -th soda. If 1 -st soda cannot reach i -the soda, you should just output -1.
Sample Input
152 0 0 0 13 1 1 0 51 1 1 1 1
Sample Output
0 2 1 1 -1HintIf you need a larger stack size, please use #pragma comment(linker, "/STACK:102400000,102400000") and submit your solution using C++.
#include <iostream>#include <stdio.h>#include <string.h>#include <queue>#include <cmath>#include <algorithm>using namespace std;const int maxn=2*10e5+10;const __int64 inf=(1LL<<62);__int64 dist[maxn];int l[maxn],r[maxn],c[maxn],pre[maxn];struct Node{ int x; __int64 dist; friend bool operator < (const Node &a,const Node &b) { return a.dist>b.dist; }};priority_queue <Node> q;int fin(int x){ int r=x; while(r!=pre[r]) { r=pre[r]; } int k=x; while(pre[k]!=r) { int j=pre[k]; pre[k]=r; k=j; } return r;}void join(int x,int y){ int fx=fin(x); int fy=fin(y); if(fx!=fy) pre[fx]=fy;}int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&l[i]); for(int i=1;i<=n;i++) scanf("%d",&r[i]); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1;i<=n+1;i++) { dist[i]=inf; pre[i]=i; } Node a; dist[1]=c[1]; a.x=1,a.dist=0; q.push(a); while(!q.empty()) { Node b=q.top(); q.pop(); int num=b.x; for(int i=-1;i<=1;i+=2) { int L=num+l[num]*i; int R=num+r[num]*i; if(L>R) swap(L,R); if(L>n||R<=0)continue; L=max(L,1),R=min(R,n); for(int k=L;k<=R;k++) { k=fin(k); if(k>R)break; if(dist[k]>dist[num]+c[k]) { dist[k]=dist[num]+c[k]; Node c; c.x=k,c.dist=dist[k]; q.push(c); } join(k,k+1); } } } printf("0"); for(int i=2;i<=n;i++) { if(dist[i]==inf) printf(" -1"); else printf(" %I64d",dist[i]-c[i]); } printf("\n"); } return 0;}
0 0
- HDu 5361
- HDU 5361 In Touch
- HDU 5361 In Touch
- HDU 5361(dijkstra变形)
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- ibatis批量插入
- java多线程——线程的创建和启用
- 什么是Base64
- 第二周项目(5):体验复杂度(2)
- HDU 5032 Always Cook Mushroom (极角排序 x 树状数组)
- HDu 5361
- iOS KVC setValuesForKeysWithDictionary的使用
- 第二周—项目3 体验复杂度—汉诺塔
- SSL协议到底工作在OSI模型中的那一层?
- Item 25:考虑实现一个不抛异常的swap Effective C++笔记
- 为什么pthread_cond_wait需要互斥锁为参数
- iOS 8 AutoLayout与Size Class
- 最长的可整合子数组的长度+累计和为k的最长子数组
- LAMP基础环境的搭建,即Linux、Apache、MySQL、PHP环境