萌新刚学OI,求助大佬!
查看原帖
萌新刚学OI,求助大佬!
113190
Qiuly楼主2019/2/25 10:47

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;
}
2019/2/25 10:47
加载中...