诗人小 G
啊。。我觉得这个还是挺难的。。。
#include <lastweapon/io>
using namespace lastweapon;
const int N = int(1e5) + 9;
long double f[N]; int pre[N];
char str[N][31]; int s[N];
PII Q[N]; int cz, op;
int n,l,p;
long double poww(long double x, int b) {
long double z = 1;
while (b) {
if (b&1) z *= x;
x *= x; b >>= 1;
}
return z;
}
long double calc(int a, int b) {
return f[a] + poww(abs(s[b]-s[a]-l), p);
}
int left(int a, int b) {
int l = a, r = n+1;
while (l < r) {
int m = (l + r) / 2;
if (calc(b, m) <= calc(a, m)) {
r = m;
} else {
l = m + 1;
}
}
return l;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
Rush {
RD(n,l,p);++l;
REP_1(i, n) s[i] = s[i-1] + strlen(RS(str[i])) + 1;
cz = 0, op = 0; Q[0] = {0, n+1};
REP_1(i, n) {
//f[i] = OO; REP(j, i) if (checkMin(f[i], calc(j, i))) pre[i] = j;
while (cz < op && Q[cz+1].se <= i) ++cz;
f[i] = calc(pre[i] = Q[cz].fi, i);
int j = left(Q[op].fi, i);
while (cz < op && j <= Q[op].se) j = left(Q[--op].fi, i);
Q[++op] = {i, j};
}
//REP_1(i, n) cout << f[i] << " "; cout << endl;
//REP_1(i, n) cout << pre[i] << " "; cout << endl;
if (f[n] > 1e18) puts("Too hard to arrange");
else {
printf("%.0Lf\n", f[n]);
VI I; int x = n; I.PB(x);
do I.PB(x = pre[x]); while (x);
DWN(i, SZ(I), 1) {
FOR(j, I[i]+1, I[i-1]) printf("%s ", str[j]);
puts(str[I[i-1]]);
}
}
puts("--------------------");
}
}




Alca
Amber
Belleve Invis
Chensiting123
Edward_mj
Fotile96
Hlworld
Kuangbin
Liyaos
Lwins
LYPenny
Mato 完整版
Mikeni2006
Mzry
Nagatsuki
Neko13
Oneplus
Rukata
Seter
Sevenkplus
Sevenzero
Shirleycrow
Vfleaking
wangzhpp
Watashi
WJMZBMR
Wywcgs
XadillaX
Yangzhe
三途川玉子
About.me
Vijos
