社区讨论
这里提供一个其他的单调队列实现
P2569[SCOI2010] 股票交易参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m0mjqjwe
- 此快照首次捕获于
- 2024/09/03 22:50 2 年前
- 此快照最后确认于
- 2024/09/04 08:39 2 年前
RT
CPPint calc1(int i, int k) {
return f[i - w - 1][k] + k * ap[i];
}
int calc2(int i, int k) {
return f[i - w - 1][k] + k * bp[i];
}
CPPfor (int i = 1; i <= t; i ++) {
for (int k = 0; k <= as[i]; k ++)
f[i][k] = -k * ap[i];
q1[l1 = r1 = 1] = 0, q2[l2 = r2 = 1] = 0;
if (i - w - 1 >= 1)
for (int k = 1; k <= bs[i]; k ++) {// 初始化卖股票窗口
while (l2 <= r2 && calc2(i, q2[r2]) <= calc2(i, k)) r2 --;
q2[++ r2] = k;
}
for (int j = 0; j <= m; j ++) {
f[i][j] = max(f[i - 1][j], f[i][j]);
if (i - w - 1 >= 1) {
if (j - 1 >= 0) {
while (l1 <= r1 && calc1(i, q1[r1]) <= calc1(i, j - 1)) r1 --;
q1[++ r1] = j - 1;
}
while (l1 <= r1 && q1[l1] < j - as[i]) l1 ++;
if (l1 <= r1) f[i][j] = max(calc1(i, q1[l1]) - j * ap[i], f[i][j]);
if (j + bs[i] <= m) {
while (l2 <= r2 && calc2(i, q2[r2]) <= calc2(i, j + bs[i])) r2 --;
q2[++ r2] = j + bs[i];
}
while (l2 <= r2 && q2[l2] < j + 1) l2 ++;
if (l2 <= r2) f[i][j] = max(calc2(i, q2[l2]) - j * bp[i], f[i][j]);
}
}
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...