题意:给一个2n的矩阵,每一个点有一个权值,从左上角出发,时间t=0开始,连续的走,将矩阵走完,每走一步,t++,并且得到t当前格子的权值的值,问如何走,使得最走完得到的最大权值和是多少。
不难发现方案一定是先走一个S形,再直着走到头,再走回来。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
typedef long long ll;
ll a[maxn], b[maxn];
ll sum[maxn][2], Lsum[maxn][2], Rsum[maxn][2];
ll dp[maxn][2];
ll res[maxn];
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
sum[i][0] = sum[i - 1][0] + a[i];
Lsum[i][0] = Lsum[i - 1][0] + i * a[i];
}
for (int i = 1; i <= n; i++) {
scanf("%lld", &b[i]);
sum[i][1] = sum[i - 1][1] + b[i];
Lsum[i][1] = Lsum[i - 1][1] + i * b[i];
}
for (int i = n; i >= 1; i--) {
Rsum[i][0] = Rsum[i + 1][0] + (n - i + 1) * a[i];
Rsum[i][1] = Rsum[i + 1][1] + (n - i + 1) * b[i];
}
int cnt = 0;
for (int i = 1; i <= n; i += 2) {
dp[i][0] = cnt++; dp[i][1] = cnt++;
dp[i + 1][1] = cnt++; dp[i + 1][0] = cnt++;
}
for (int i = 1; i <= n; i++) {
res[dp[i][0]] = dp[i][0] * a[i];
res[dp[i][1]] = dp[i][1] * b[i];
}
for (int i = 1; i <= 2 * n; i++) {
res[i] += res[i - 1];
}
ll ans = 0;
for (int i = 1; i <= n; i++) {
if (dp[i][0] % 2 == 0) {
ll s1 = sum[n][0] - sum[i - 1][0];
ll s2 = Lsum[n][0] - Lsum[i - 1][0];
ll tmp1 = 0, tmp2 = 0;
if (i >= dp[i][0]) {
tmp1 = s2 - s1 * (i - dp[i][0]);
} else {
tmp1 = s2 + s1 * (dp[i][0] - i);
}
ll s4 = sum[n][1] - sum[i - 1][1];
ll s5 = Rsum[i][1] - Rsum[n + 1][1];
ll x = dp[i][0] + (n - i);
tmp2 = s5 + s4 * x;
ans = max(ans, tmp1 + tmp2 + (!dp[i][0] ? 0 : res[dp[i][0] - 1]));
// cout << i << " " << ans << endl;
}
if (dp[i][1] % 2 == 0) {
ll s1 = sum[n][1] - sum[i - 1][1];
ll s2 = Lsum[n][1] - Lsum[i - 1][1];
ll tmp1 = 0, tmp2 = 0;
if (i >= dp[i][1]) {
tmp1 = s2 - s1 * (i - dp[i][1]);
} else {
tmp1 = s2 + s1 * (dp[i][1] - i);
}
ll s4 = sum[n][0] - sum[i - 1][0];
ll s5 = Rsum[i][0] - Rsum[n + 1][0];
ll x = dp[i][1] + (n - i);
tmp2 = s5 + s4 * x;
ans = max(ans, tmp1 + tmp2 + (!dp[i][1] ? 0 : res[dp[i][1] - 1]));
// cout << i << " " << ans << endl;
}
}
printf("%lld\n", ans);
return 0;
} 给你一个长度为n的整形数组a,和m次询问
对于每次询问:输出S(l, r, k)的值。
S(l, r, k) = a[l] * k + a[l + 1] * (k + 1) + a[l + 2] * (k + 2) .... + a[r]*(r - l + k)
1 <= n, m, a[i], k <= 1e6

京公网安备 11010502036488号