Codeforces Round #366 (Div. 1):Ant Man(贪心)

B. Ant Man

time limit per test

 4 seconds

memory limit per test

 256 megabytes

input

 standard input

output

 standard output

Scott Lang is at war with Darren Cross. There are n chairs in a hall where they are, numbered with 1, 2, ..., n from left to right. The i-th chair is located at coordinate xi. Scott is on chair number s and Cross is on chair number e. Scott can jump to all other chairs (not only neighboring chairs). He wants to start at his position (chair number s), visit each chair exactly once and end up on chair number e with Cross.

As we all know, Scott can shrink or grow big (grow big only to his normal size), so at any moment of time he can be either small or large (normal). The thing is, he can only shrink or grow big while being on a chair (not in the air while jumping to another chair). Jumping takes time, but shrinking and growing big takes no time. Jumping from chair number i to chair number j takes |xi - xj| seconds. Also, jumping off a chair and landing on a chair takes extra amount of time.

If Scott wants to jump to a chair on his left, he can only be small, and if he wants to jump to a chair on his right he should be large.

Jumping off the i-th chair takes:

  • ci extra seconds if he's small.
  • di extra seconds otherwise (he's large).

Also, landing on i-th chair takes:

  • bi extra seconds if he's small.
  • ai extra seconds otherwise (he's large).

In simpler words, jumping from i-th chair to j-th chair takes exactly:

  • |xi - xj| + ci + bj seconds if j < i.
  • |xi - xj| + di + aj seconds otherwise (j > i).

Given values of xabcd find the minimum time Scott can get to Cross, assuming he wants to visit each chair exactly once.

Input

The first line of the input contains three integers n, s and e (2 ≤ n ≤ 5000, 1 ≤ s, e ≤ n, s ≠ e) — the total number of chairs, starting and ending positions of Scott.

The second line contains n integers x1, x2, ..., xn (1 ≤ x1 < x2 < ... < xn ≤ 109).

The third line contains n integers a1, a2, ..., an (1 ≤ a1, a2, ..., an ≤ 109).

The fourth line contains n integers b1, b2, ..., bn (1 ≤ b1, b2, ..., bn ≤ 109).

The fifth line contains n integers c1, c2, ..., cn (1 ≤ c1, c2, ..., cn ≤ 109).

The sixth line contains n integers d1, d2, ..., dn (1 ≤ d1, d2, ..., dn ≤ 109).

Output

Print the minimum amount of time Scott needs to get to the Cross while visiting each chair exactly once.

Example

input

7 4 3
8 11 12 16 17 18 20
17 16 20 2 20 5 13
17 8 8 16 12 15 13
12 4 16 4 15 7 6
8 14 2 11 17 12 8

output

139

Note

In the sample testcase, an optimal solution would be . Spent time would be17 + 24 + 23 + 20 + 33 + 22 = 139.

 

题意:在一个数轴上有n个点,每个点有5个值x,a,b,c,d,你每次可以从一个点i跳跃到另外一个点j,如果j在i的右

边,则需要花费abs(i-j)+i[d]+j[a],如果j在i的左边,则需要花费abs(i-j)+i[c]+j[b],一开始你位于a点,你的目的是遍历

所有的点1遍并且最后停在b点,求最小花费(每个点最多遍历1遍)

 

(感觉这题不难,直接贪心)

初始化链:net[a] = b表示直接从起点a跳到终点b

然后枚举其他所有的点,将它们一个一个加入链中(寻找加入到链中的什么地方成本最低)

例如样例:

①:初始化:4->3

②:插入编号为1的点,显然1只能插入一个地方,插入后:4->1->3

③:插入编号为2的点,2可以插入两个地方(4和1中间或1和3中间),可以轻松算出插入4和1中间成本更低,所以

插入后:4->2->1->3

④:编号为3和4的点是起点和终点,跳过

⑤:插入编号为5的点,5可以插入三个地方,其中插入1和3中间成本更低,插入后:4->2->1->5->3

⑥:插入编号为6的点,……,插入后:4->2->1->6->5->3

……

复杂度:n²

 

 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
typedef struct
{
	__int64 x;
	__int64 rl, rr, ll, lr;
}Point;
Point s[5005];
__int64 net[5005];
__int64 AtoB(Point a, Point b)
{
	if(b.x<a.x)
		return abs(a.x-b.x)+a.ll+b.rr;
	return abs(a.x-b.x)+a.lr+b.rl;
}
int main(void)
{
	__int64 n, a, b, i, j, k, temp, sum, best;
	scanf("%I64d%I64d%I64d", &n, &a, &b);
	for(i=1;i<=n;i++)
		scanf("%I64d", &s[i].x);
	for(i=1;i<=n;i++)
		scanf("%I64d", &s[i].rl);
	for(i=1;i<=n;i++)
		scanf("%I64d", &s[i].rr);
	for(i=1;i<=n;i++)
		scanf("%I64d", &s[i].ll);
	for(i=1;i<=n;i++)
		scanf("%I64d", &s[i].lr);
	sum = AtoB(s[a], s[b]);
	net[a] = b;
	for(i=1;i<=n;i++)
	{
		if(i==a || i==b)
			continue;
		k = 10000000000000ll;
		for(j=a;j!=b;j=net[j])
		{
			temp = AtoB(s[j], s[i])+AtoB(s[i], s[net[j]])-AtoB(s[j], s[net[j]]);
			if(temp<k)
			{
				k = temp;
				best = j;
			}
		}
		sum += k;
		net[i] = net[best];
		net[best] = i;
	}
	printf("%I64d\n", sum);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值