@Garbage Collector@
@题目描述 - English@
Time limit : 2sec / Memory limit : 1024MB
Score : 700 points
Problem Statement
Snuke has decided to use a robot to clean his room.
There are N pieces of trash on a number line. The i-th piece from the left is at position xi. We would like to put all of them in a trash bin at position 0.
For the positions of the pieces of trash, 0 < x1 < x2 < … < xN ≤ 10^9 holds.
The robot is initially at position 0. It can freely move left and right along the number line, pick up a piece of trash when it comes to the position of that piece, carry any number of pieces of trash and put them in the trash bin when it comes to position 0. It is not allowed to put pieces of trash anywhere except in the trash bin.
The robot consumes X points of energy when the robot picks up a piece of trash, or put pieces of trash in the trash bin. (Putting any number of pieces of trash in the trash bin consumes X points of energy.) Also, the robot consumes (k+1)^2 points of energy to travel by a distance of 1 when the robot is carrying k pieces of trash.
Find the minimum amount of energy required to put all the N pieces of trash in the trash bin.
Constraints
1≤N≤2×10^5
0 < x1 < … < xN≤10^9
1≤X≤10^9
All values in input are integers.
Partial Scores
400 points will be awarded for passing the test set satisfying N≤2000.
Input
Input is given from Standard Input in the following format:
N X
x1 x2 … xN
Output
Print the answer.
Sample Input 1
2 100
1 10
Sample Output 1
355
Travel to position 10 by consuming 10 points of energy.
Pick up the piece of trash by consuming 100 points of energy.
Travel to position 1 by consuming 36 points of energy.
Pick up the piece of trash by consuming 100 points of energy.
Travel to position 0 by consuming 9 points of energy.
Put the two pieces of trash in the trash bin by consuming 100 points of energy.
This strategy consumes a total of 10+100+36+100+9+100=355 points of energy.
Sample Input 2
5 1
1 999999997 999999998 999999999 1000000000
Sample Output 2
19999999983
Sample Input 3
10 8851025
38 87 668 3175 22601 65499 90236 790604 4290609 4894746
Sample Output 3
150710136
Sample Input 4
16 10
1 7 12 27 52 75 731 13856 395504 534840 1276551 2356789 9384806 19108104 82684732 535447408
Sample Output 4
3256017715
@中文题意@
一个机器人从原点出发,要清扫在坐标轴上的垃圾。原点有一个垃圾桶。机器人可以在坐标轴上左右移动,当移动到某个垃圾的位置上时,可以选择花费 X 点能量将它捡起来(也可以视而不捡)。机器人如果到达垃圾桶,则可以将它携带的垃圾花费 X 点能量倒出。机器人如果携带着 K 件垃圾移动一个单位距离,则需要消耗 (K+1)^2 点能量。
问将所有垃圾全部弄到垃圾桶里面去所需消耗的最小能量。
@分析@
考虑到代价如果是由两部分(捡垃圾扔垃圾,移动)组成的不好考虑,我们可以分开处理。显然每个垃圾都需要捡起来,则至少有N*X点花费。假如我们去倒了K次垃圾,则有K*X点花费。
我们考虑某一次倒垃圾的过程:先从原点出发,再按照一定顺序遍历完某一个集合 S 的点,最后回到原点。嘛……这里有一个贪心性质但我不会证明:我们先从原点直接到达距离最远的点,再往回走,在归程中收集垃圾并在原点的垃圾桶倒垃圾。
这样代价怎么表示出来呢?令集合 S 的点依次为X[1], X[2], X[3] ….X[s]。如图所示:
于是?总花费等于 = 每个点的 X 坐标 * 一个系数。然后又是一个贪心性质:因为我们倒了K次垃圾,所以最多有2*K个点的系数为5,最多有K个点的系数为7…..我们将较远的点赋一个较小的系数,可以发现这样一定是最优的。
K的取值从1到N,每一种类系数可以用前缀和O(1)弄出,对于每个K有N/K种系数要考虑。则一个经典的时间复杂度O(N/1+N/2+N/3+…+N/N) = O(NlogN)
【注意会溢出long long!】
【注意会溢出long long!】
【注意会溢出long long!】
@代码@
【跪在第一步QAQ……】
【不过还好考场上我跳过了这道题qwq】
如果有什么不懂的地方可以留言在下面问我哦~我会尽力解答的OuO
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN = 200000;
ull sum[MAXN + 5];
int main() {
int N; ull X;
cin >> N >> X;
for(int i=1;i<=N;i++) {
cin >> sum[i];
sum[i] += sum[i-1];
}
ull ans = X*N + sum[N]*5;
for(int i=1;i<N;i++) {
ull res = X*i;
if( 2*i >= N )
res = res + sum[N]*5;
else {
ull coef = 7;
int lst = N - 2*i;
res = res + (sum[N]-sum[N-2*i])*5;
while( lst >= i ) {
res = res + (sum[lst]-sum[lst-i])*coef;
lst -= i; coef += 2;
}
res = res + sum[lst]*coef;
}
if( res < ans ) ans = res;
}
cout << ans + X*N;
}
@END@
就是这样,新的一天里,也请多多关照哦(ノω<。)ノ))☆.。~