bzoj1563(dp,四边形不等式优化)

Description
这里写图片描述
Input
这里写图片描述
Output
对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出”Too hard to arrange”(不包含引号)。每个输出后面加”——————–”
Sample Input
4
4 9 3
brysj,
hhrhl.
yqqlm,
gsycl.
4 9 2
brysj,
hhrhl.
yqqlm,
gsycl.
1 1005 6
poet
1 1004 6
poet
Sample Output
108
− − − − − − − − − − − − − − − − − − − −
32
− − − − − − − − − − − − − − − − − − − −
Too hard to arrange
− − − − − − − − − − − − − − − − − − − −
10000000000000000000
− − − − − − − − − − − − − − − − − − − −
【样例说明】
前两组输入数据中每行的实际长度均为6,后两组输入数据每行的实际长度均为4。一个排版方案中每行相邻两个句子之间的空格也算在这行的长度中(可参见样例中第二组数据)。每行末尾没有空格。
HINT
总共10个测试点,数据范围满足:
测试点 T N L P
1 ≤10 ≤18 ≤100 ≤5
2 ≤10 ≤2000 ≤60000 ≤10
3 ≤10 ≤2000 ≤60000 ≤10
4 ≤5 ≤100000 ≤200 ≤10
5 ≤5 ≤100000 ≤200 ≤10
6 ≤5 ≤100000 ≤3000000 2
7 ≤5 ≤100000 ≤3000000 2
8 ≤5 ≤100000 ≤3000000 ≤10
9 ≤5 ≤100000 ≤3000000 ≤10
10 ≤5 ≤100000 ≤3000000 ≤10
所有测试点中均满足句子长度不超过30。
Source


四边形不等式优化dp
算是板子了吧。

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)
#define P pair<int,int>
#define Pil pair<int,ll>
#define Pli pair<ll,int>
#define Pll pair<ll,ll>
#define pb push_back 
#define pc putchar
#define mp make_pair
#define file(k) memset(k,0,sizeof(k))
#define ll long double
const long long INF = 1e18;
int read()
{
    int sum = 0;char c = getchar();bool flag = true;
    while(c < '0' || c > '9') {if(c == '-') flag = false;c = getchar();}
    while(c >= '0' && c <= '9') sum = sum * 10 + c - 48,c = getchar();
    if(flag) return sum;
    else return -sum;
}
struct node{
    int j,l,r;
};
int n , l , p;
ll len[101000];
ll sum[101000] , f[101000];
char s[31];
int last;
ll Pow(ll a)
{
    ll now = 1;
    int tmp = p;
    while(tmp)
    {
        if(tmp & 1) now *= a;
        a = a * a;
        tmp >>= 1;
    }
    return now;
}
ll V(int a,int b)
{
    ll ans = 0;
    ans = sum[b] - sum[a] + b - a - 1;
    ans = fabs(ans - l);
    ans = Pow(ans);
    return ans;
}
void work()
{
    int k = 0;
    rep(i,1,n)
    {
        while(k < i-1 && f[k] + V(k,i) > f[k+1] + V(k+1,i))k++; 
        f[i] = f[k] + V(k,i);
    }
}
void init()
{
    n = read();l = read();p = read();
    rep(i,1,n) scanf("%s",s+1),len[i] = strlen(s+1),sum[i] = sum[i-1] + len[i];
    work();
    if(f[n] > INF) printf("Too hard to arrange\n");
    else printf("%lld\n",(long long)f[n]);
    printf("--------------------\n");
}
int main()
{
    freopen("8.in","r",stdin);
    int T = read();
    while(T--) init();
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值