记录编号 |
587062 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2009]诗人小G |
最终得分 |
100 |
用户昵称 |
┭┮﹏┭┮ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.177 s |
提交时间 |
2024-03-11 16:53:40 |
内存使用 |
9.35 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
//二分队列-决策单调性优化dp
#define ll long long
#define ld long double
const int N = 1e5+10;
const ll inf = 1e17;
int t,n,p,l,r,la[N];
ld f[N];
ll L,s[N];
char c[N][40];
struct made{
int p,l,r;
}q[N];
ld power(ld x,int y){
ld ans = 1;
while(y){
if(y & 1)ans *= x;
x *= x,y >>= 1;
}return ans;
}
ll ab(ll x){return x < 0 ? -x : x;}
ld W(int l,int r){return power(ab(s[r]-s[l]-L),p);}
ld val(int l,int r){return f[l] + W(l,r);}
int work(int i,int L,int R){
while(L < R){
int mid = L + R >> 1;
if(val(i,mid) <= val(q[r].p,mid))R = mid;
else L = mid + 1;
}
return L;
}
void prin(int x){
if(la[x] == x)return;
prin(la[x]);
for(int i = la[x]+1;i <= x;i++)printf("%s",c[i]),printf(i==x?"\n":" ");
}
void solve(){
scanf("%d%lld%d",&n,&L,&p);L++;
for(int i = 1;i <= n;i++)scanf("%s",c[i]),s[i] = s[i-1] + strlen(c[i]) + 1;
l = r = 1,q[1] = {0,1,n};
for(int i = 1;i <= n;i++){
while(l < r && q[l].r < i)l++;q[l].l = i;
int j = q[l].p;la[i] = j;
f[i] = f[j] + W(j,i);
while(l < r && val(i,q[r].l) <= val(q[r].p,q[r].l))r--;
j = work(i,q[r].l,q[r].r+1);
if(j <= n)q[r].r = j-1,q[++r] = {i,j,n};
}
if(f[n] > 1e18)printf("Too hard to arrange\n");
else printf("%lld\n",(ll)f[n]),prin(n);
printf("--------------------\n");
}
int main(){
freopen("noi09_poet.in","r",stdin);
freopen("noi09_poet.out","w",stdout);
scanf("%d",&t);
while(t--)solve();
return 0;
}