OLE*2 其他 WA,样例已过,求助
查看原帖
OLE*2 其他 WA,样例已过,求助
655192
Tibrella楼主2023/7/12 21:21

f128 : long double
i128 : __int128
i64 : long long
i32 : int

f128 calc(const i32& i, const i32& j) {
    f128 res = 1;
    i32 p = ::p;
    for (f128 a = abs(s[i] - s[j] - 1 - l); p; p >>= 1, a = a * a)  // ::p 就是把全局变量 p 复制进来,但是不修改全局的 p
        if (p & 1) {
            res *= a;
        }  // 快速幂,log(10)=3,算常数复杂度
    return res + f[j];
}

i32 find(const d& x, const i32& i) {
    i32 l = x.l, r = x.r;
    while (l < r) {
        i32 mid = (l + r) >> 1;
        if (calc(mid, x.p) >= calc(mid, i))
            r = mid;
        else
            l = mid + 1;
    }
    return r - 1;
}

void solve() {
    cin >> n >> l >> p;
    for (i32 i = 1; i <= n; ++i) {
        cin >> poem[i];
        s[i] = poem[i].size() + s[i - 1] + 1;
    }

    // DP 部分
    std::deque<d> q;
    q.emplace_front((d){ 1, n, 0 });  // 第一个可决策点就是 0
    for (i32 i = 1; i <= n; ++i) {
        if (!q.empty()) {
            if (q.front().r == i - 1)
                q.pop_front();
            else
                q.front().l = i;  // 没用的决策扔掉
        }
        i32 j = q.front().p;
        f[i] = calc(i, j);
        nxt[j] = i;  // 记录最佳决策点
        while (!q.empty() && calc(q.back().l, q.back().p) >= calc(q.back().l, i)) {
            q.pop_back();
        }
        if (!q.empty()) {
            if (calc(q.back().r, q.back().p) <= calc(q.back().r, i))
                q.emplace_back((d){ i, n, i });
            else {
                i32 pos = find(q.back(), i);
                q.back().r = pos;
                q.emplace_back((d){ pos + 1, n, i });
            }
        } else
            q.emplace_back((d){ i + 1, n, i });
    }
    if (f[n] > 1e18) goto failed;

    cout << (i64)f[n] << std::endl;
    nxt[n] = n + 1;

    // 还原答案
    for (i32 i = 0; i <= n; i = nxt[i]) {
        for (i32 j = i + 1; j <= nxt[i] && j <= n; ++j) {
            cout << poem[j];
            if (j != nxt[i]) cout.put(' ');
        }
        if (i != n) cout.put('\n');
    }

    return;

failed:
    cout << "Too hard to arrange\n";
}
2023/7/12 21:21
加载中...