社区讨论

汇总hack数据

P2120[ZJOI2007] 仓库建设参与者 11已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@m1u3cguu
此快照首次捕获于
2024/10/04 10:13
去年
此快照最后确认于
2025/11/04 18:08
4 个月前
查看原帖
汇总一下讨论区所有的hack样例
TXT
1
0 0 1

5
0 0 5
3 1 2
5 0 3
7 9 2
9 0 1

2
0 1 1
1 0 2

2
0 100 200
1 0 0
总结来说就是没有考虑本站点货物数为0的情况。
附上一份李超线段树AC代码,并且指出了我自己wa的原因。
CPP
#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define inf ((1ull << 63) - 1)
using namespace std;

const int N = 2e6 + 5;
int n, m, k, cnt;
struct line
{
    int k, b;
    int calc(int x) {
        return k * x + b;
    }
};
struct tree
{
    line l;
    int ls, rs;
} t[N * 4];

#define ls t[k].ls
#define rs t[k].rs

void insert(int &k, int L, int R, line g)
{
    if (!k)
    {
        k = ++cnt;
        // t[k].lazy = 1;
        t[k].l = g;
        return;
    }
    if (L == R)
    {
        if (g.calc(L) < t[k].l.calc(L)) t[k].l = g;
        return;
    }
    int mid = (L + R) >> 1;
    if (g.calc(mid) < t[k].l.calc(mid)) swap(t[k].l, g);

    if (g.k > t[k].l.k) insert(ls, L, mid, g);
    else if (g.k < t[k].l.k) insert(rs, mid + 1, R, g);
}
int find(int k, int L, int R, int x)
{
    if (!k) return inf;
    if (L == R) return t[k].l.calc(x);
    int mid = (L + R) >> 1;
    if (x <= mid) return min(find(ls, L, mid, x), t[k].l.calc(x));
    return min(find(rs, mid + 1, R, x), t[k].l.calc(x));
}

int V = 0;
void update(line g) { insert(k, 0, V, g); }
int ask(int x) { return find(k, 0, V, x); }

struct node
{
    int x, p, c;
} e[N];
int qp[N], qpx[N], dp[N];

void solve()
{
    int n;
    cin >> n;   
    for (int i = 1; i <= n; i++) 
    {
        cin >> e[i].x >> e[i].p >> e[i].c;
        qp[i] = qp[i - 1] + e[i].p;
        qpx[i] = qpx[i - 1] + e[i].p * e[i].x;
        V = max(V, e[i].x);
    }
    dp[0] = 0;
    update({-qp[0], qpx[0] + dp[0]});
    for (int i = 1; i <= n; i++)
    {
        dp[i] = ask(e[i].x) + e[i].c + qp[i - 1] * e[i].x - qpx[i - 1];
        if (e[i].p == 0) dp[i] = min(dp[i - 1], dp[i]); // 添加本行代码以后ac,原因:这个地方没有货物则dp值需要与前一个站点的dp值取min
        update({-qp[i], qpx[i] + dp[i]});
    }
    cout << dp[n] << '\n';
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int T = 1; // cin >> T;
    while (T--) solve();
    return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...