求助,本地RE IDEwa 提交AC 怎么会是呢
查看原帖
求助,本地RE IDEwa 提交AC 怎么会是呢
763998
switch_on楼主2023/4/14 20:32
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<cstring> 
#include<assert.h>
using namespace std;
typedef long long ll;//QAQ 
const string shift="--------------------";
const int M=3e6+7; 
int t, n, L, P; string st[M]; int final[M];
ll a[M], sa[M]; long double f[M];
//f[i] 事前i个句子排版最小不协调度。 
struct Q{
	int j, l, r;
}p[M]; 
long double ppp(ll _a, int b){
	long double a = _a;
	long double res=1;
	while(b>0) {if(b&1) res*=a; a=a*a, b>>=1;}
	return res;
}
long double val(int i, int j){
	return f[j]+ppp(abs(sa[i]-sa[j]+(i-j-1-L)), P);
}
int v[M], qwq;
int main(){
//	freopen("2.in","r",stdin);
//	freopen("3.out","w",stdout); 
	scanf("%d", &t);
	while(t--){
		memset(v, 0, sizeof(v)); qwq=0;
		memset(final, 0, sizeof(final));
		memset(p, 0, sizeof(p)); 
		//多测不清空 爆零两行泪 
		scanf("%d%d%d", &n, &L, &P);
		for(int i=1; i<=n; i++){
			cin>>st[i]; a[i]=st[i].size();
			sa[i]=sa[i-1]+a[i];//总之先写上…! 
		}
		
		int l=1, r=1; f[0]=0;
		p[l]={0, 1, n};
		bool op=0;
		for(int i=1; i<=n; i++){
			for(int j=l;j<=l;j++){
				cerr<<p[j].j<<'\n';
			}

			while(l<r && p[l].r<i){
				l++;
			}
			p[l].l=i;
			int j=p[l].j;
			f[i]=val(i, j); int pos; 
			v[i]=p[l].j;  
//			if(f[i]>1e18){
//				op=1; break;
//			}
			while(r>=l&&val(p[r].l, i)<=val(p[r].l, p[r].j)){
				pos=p[r].l; r--; 
			}
			if(r>=l&&val(p[r].r, i)<=val(p[r].r, p[r].j)){
				int ll=p[r].l, rr=p[r].r;
				while(ll<rr){
					int mid=(ll+rr)>>1;
					if(val(mid, i)<=val(mid, p[r].j)) rr=mid;
					else ll=mid+1;
				}
				pos=ll;//二分肯定没写错。(点头 
				p[r].r=pos-1;
			}
			p[++r]={i, pos, n};
		}
		
		int top=0;
		for(int i=n; i; i=v[i]){
			cerr<<i<<endl;
			final[++top]=i;
		}
		reverse(final+1, final+top+1);
		if(f[n]>1e18)	printf("Too hard to arrange\n");
		else{
			printf("%.0Lf\n", f[n]);
			for(int i=0; i<top; i++){
				for(int j=final[i]+1; j<final[i+1]; j++){
					cout<<st[j]<<" ";
				}
				cout<<st[final[i+1]]<<endl;
			}
		}
		cout<<shift;
		if(t>0) printf("\n");
	}
	return 0;
}

似乎是f[n]的锅,但是交上去就ac惹qwq

然后一测IDE居然WA了??

2023/4/14 20:32
加载中...