inline void psh1(int i, int j)
{
while (q1.size() && f[i - w - 1][q1.front()] + q1.front() * ap[i] < f[i - w - 1][j] + j * ap[i])
q1.pop_back();
q1.push_back(j);
}
inline void psh2(int i, int j)
{
while (q2.size() && f[i - w - 1][q2.front()] + q2.front() * bp[i] < f[i - w - 1][j] + j * bp[i])
q2.pop_back();
q2.push_back(j);
}
int main()
{
for (int i = 1; i <= t; i++)
{
for (int j = 0; j <= as[i]; j++)
f[i][j] = -j * ap[i];
for (int j = 0; j <= p; j++)
f[i][j] = max(f[i][j], f[i - 1][j]);
if (i - w - 1 < 1)
continue;
q1 = deque<int>(), q2 = deque<int>();
for (int j = 0; j < bs[i]; j++)
psh2(i, j);
for (int j = 0; j <= p; j++)
{
if (j - as[i] - 1 >= 0)
pop1(j - as[i] - 1);
psh1(i, j);
if (j - 1 >= 0)
pop2(j - 1);
if (j + bs[i] <= p)
psh2(i, j + bs[i]);
f[i][j] = max(f[i][j], max(f[i - w - 1][q1.front()] - (j - q1.front()) * ap[i],
f[i - w - 1][q2.front()] + (q2.front() - j) * bp[i]));
}
}
}
如上,把入队时while循环条件中的back写成front有90pts,仅WA #8,怎么会是呢
正确写法:
inline void psh1(int i, int j)
{
while (q1.size() && f[i - w - 1][q1.back()] + q1.back() * ap[i] < f[i - w - 1][j] + j * ap[i])
q1.pop_back();
q1.push_back(j);
}
inline void psh2(int i, int j)
{
while (q2.size() && f[i - w - 1][q2.back()] + q2.back() * bp[i] < f[i - w - 1][j] + j * bp[i])
q2.pop_back();
q2.push_back(j);
}