这个有什么问题啊?调了半天了
查看原帖
这个有什么问题啊?调了半天了
375418
自由软件Free楼主2024/1/25 19:58
// P1912 未完成
#include <bits/stdc++.h>
using namespace std;
typedef long double ll;
const int N = 1e5 + 10;
int n, L, P;
char str[N][32];
int s[N], g[N], res[N];
ll f[N];
struct node
{
    int l, r, x;
} q[N];
int hh, tt;
ll w(int j, int i)
{
    ll v = 1, x = s[i] - s[j - 1] - 1;
    for (int k = P; k; k >>= 1, x *= x)
        if (k & 1)
            v *= x;
    return (v > 0 ? v : -v) + f[j - 1];
}
void insert(int i)
{
    int p = -1;
    while (hh <= tt)
    {
        if (w(i, q[tt].l) <= w(q[tt].x, q[tt].l))
            p = q[tt--].l;
        else
            break;
    }
    if (w(i, q[tt].r) < w(q[tt].x, q[tt].r))
    {
        int l = q[tt].l, r = q[tt].r, mid;
        while (l < r)
        {
            mid = (l + r) >> 1;
            if (w(i, mid) <= w(q[tt].x, mid))
                r = mid;
            else
                l = mid + 1;
        }
        q[tt].r = r - 1, p = r;
    }
    if (~p)
        q[++tt] = {p, n, i};
}
int main()
{
    freopen("poet.in", "r", stdin);
    freopen("poet.out", "w", stdout);
    int T;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d%d%d", &n, &L, &P);
        for (int i = 1; i <= n; ++i)
        {
            scanf("%s", str[i]);
            s[i] = s[i - 1] + strlen(str[i]) + 1;
        }
        hh = tt = 0, *q = {1, n, 0};
        for (int i = 1; i <= n; ++i)
        {
            insert(i);
            g[i] = q[hh].x, f[i] = w(g[i], i);
            while (hh <= tt && q[hh].r <= i)
                ++hh;
            q[hh].l = i + 1;
        }
        if (f[n] > 1e18)
            puts("Too hard to arrange");
        else
        {
            printf("%lld\n", (long long)f[n]);
            for (int i = n; i; i = g[i] - 1)
                res[g[i]] = i;
            for (int i = 1; i <= n; i = res[i] + 1)
            {
                for (int j = i; j <= res[i]; ++j)
                {
                    printf("%s", str[j]);
                    if (j != res[i])
                        putchar(' ');
                }
                putchar('\n');
            }
        }
        for (int i = 20; i--; putchar('-'))
            ;
        putchar('\n');
    }
    return 0;
}

附上题目样例输出结果:

864
brysj,
hhrhl.
yqqlm,
gsycl.
--------------------
144
brysj,
hhrhl.
yqqlm,
gsycl.
--------------------
4096
poet
--------------------
4096
poet
--------------------

2024/1/25 19:58
加载中...