为什么本题数据是用脚造的:
查看原帖
为什么本题数据是用脚造的:
598026
hzlqwq楼主2023/11/28 22:47
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);
}
2023/11/28 22:47
加载中...