RT,不知道为什么总是WA那么几个点,本蒟蒻百查不出错,故求助大佬。
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
typedef long double ld;
const int NS=1e5+2;
const int inf=1e9+9;
int T,N,L,P;
int head,tail;
int q[NS],left[NS],right[NS];
int last[NS],ans[NS],Next[NS];
char s[NS][35];
ld sum[NS],f[NS];
template <typename _Tp> inline void IN(_Tp&x){
char ch;bool flag=0;x=0;
while(ch=getchar(),!isdigit(ch))if(ch=='-')flag=1;
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
if(flag)x=-x;
}
void clear(){
memset(left,0,sizeof(left));
memset(right,0,sizeof(right));
memset(last,0,sizeof(last));
memset(sum,0,sizeof(sum));
memset(s,0,sizeof(s));
memset(f,0,sizeof(f));
}
ld pows(ld x,int y){
ld ans=1;
for(;y;y>>=1,x*=x)if(y&1)ans*=x;
return ans;
}
ld val(int j,int i){
return f[j]+pows(abs(sum[i]-sum[j]-L-1),P);
}
void half(int i){
int now=q[tail],ls=left[q[tail]],rs=N+1;
while(ls<rs){
int mid=(ls+rs)>>1;
if(val(i,mid)<val(now,mid))rs=mid;
else ls=mid+1;
}
right[q[tail]]=ls-1;
q[++tail]=i,left[i]=ls,right[i]=N;
}
void output(){
if(f[N]>1e18)puts("Too hard to arrange");
else{
printf("%lld\n",(ll)(f[N]+0.5));
for(int i=N;i;i=last[i])Next[last[i]]=i;
int now=0;
for(int i=1;i<=N;++i){
now=Next[now];
for(int j=i;j<now;++j)printf("%s ",s[j]+1);
printf("%s\n",s[now]+1);
i=now;
}
}
puts("--------------------");
return;
}
int main(){
IN(T);
while(T--){
clear();
IN(N),IN(L),IN(P);
sum[0]=0;
for(int i=1;i<=N;++i){
scanf("%s",s[i]+1);
sum[i]=sum[i-1]+strlen(s[i]+1)+1;
}
head=1,tail=1;
q[1]=0,left[0]=1,right[0]=N;
for(int i=1;i<=N;++i){
while(right[q[head]]<i)head++;
f[i]=val(q[head],i);
last[i]=q[head];
if(val(q[tail],N)<val(i,N))continue;
while(val(i,left[q[tail]])<val(q[tail],left[q[tail]]))tail--;
half(i);
}
output();
}
return 0;
}