1563: [NOI2009]诗人小G

https://lydsy.com/JudgeOnline/problem.php?id=1563

分析:

  直接转移f[i]=f[j]+cost(i,j),cost(i,j)=(sum[i]-sum[j])p

  然后有决策单调性,就可以二分+队列了。注意两个字符串之间还有一个空格,所以长度+1,很多字符串合起来后,总的长度还要-1,最后一个没空格。

  证明?byvoid

  luogu输出方案,加上后一直过不了,g,nxt数组是输出方案的部分

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL;
typedef long double LD; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const LL INF = 1e18; char str[N][], pr[];
int len[N], g[N], nxt[N];
LD f[N];
LL sum[N];
int n, Len, P;
struct Node{
int p, l, r;
Node() {}
Node(int _,int __,int ___) { p = _, l = __, r = ___; }
}q[N]; LD ksm(LD x) {
LD ans = ; int b = P;
while (b) {
if (b & ) ans = ans * x;
x = x * x;
b >>= ;
}
return ans;
}
void init() {
n = read(), Len = read(), P = read();
for (int i=; i<=n; ++i) {
scanf("%s", str[i] + );
sum[i] = sum[i - ] + (len[i] = strlen(str[i] + ) + );
}
}
LD Calc(int i,int j) {
return f[j] + ksm(abs(sum[i] - sum[j] - Len - ));
}
int binary_search(int l,int r,int x,int y) {
int ans = n;
while (l <= r) {
int mid = (l + r) >> ;
if (Calc(mid, x) < Calc(mid, y)) ans = mid, r = mid - ;
else l = mid + ;
}
return ans;
}
void solve() {
int L = , R = ;
q[++R] = Node(, , n);
for (int i=; i<=n; ++i) {
while (L <= R && q[L].r < i) L ++;
int j = q[L].p;
f[i] = Calc(i, j);
g[i] = j;
if (Calc(n, q[R].p) < Calc(n, i)) continue; // 如果最后一个点从i转移不优,那么说明i没有覆盖的区间,不需要二分了
while (L <= R && Calc(q[R].l, q[R].p) > Calc(q[R].l, i)) R --;
q[R].r = binary_search(q[R].l, n, i, q[R].p) - ;
q[++R] = Node(i, q[R - ].r + , n);
}
}
void print() {
if (f[n] > INF) puts("Too hard to arrange");
else printf("%lld\n", (LL)(f[n]));
puts(pr);
}
int main() {
strcpy(pr, "--------------------");
int T = read();
while (T--) {
init();
solve();
print();
}
return ;
}

最新文章

  1. Debian8.3安装flash插件,备用~~~
  2. 第四周作业-yjw
  3. Visual Studio Code 使用 Typings 实现智能提示功能
  4. 网页中的CSS换行控制
  5. 安卓系统上安装.net运行时 mono runtime
  6. 设置Sql Agent运行Job时的执行账户
  7. 【HDOJ】5446 Unknown Treasure
  8. C++动态链接库测试实例
  9. 一个C#的XML数据库访问类
  10. Date与Calendar
  11. jQuery实现的全选、反选和不选功能
  12. Swift Array copy 的线程安全问题
  13. Pyhton编程(三)之Pycharm安装及运算符
  14. PHP FTP 函数
  15. PJSUA2开发文档--第六章 媒体 Media类
  16. python 数据驱动ddt使用,需要调用下面的代码,请挨个方法调试,把不用的注释掉
  17. MAC book 无法删除普通用户的解决办法
  18. Codeforces Round #546 (Div. 2) E 推公式 + 线段树
  19. 为什么byte的取值范围是-128到127
  20. ELK日志系统:Filebeat使用及Kibana如何设置登录认证(转)

热门文章

  1. iOS离屏渲染的解释:渲染与cpu、gpu
  2. 最大传输单元MTU
  3. 「bzoj 4180: 字符串计数」
  4. Golang 单元测试和性能测试
  5. iOS沙盒目录文件操作
  6. STM8 亮灯程序
  7. Qt之操作数据库(SQLite)实例
  8. android TextView里边实现图文混配效果
  9. Java中如何判断一个字符串是否为数字
  10. 解决Js跨域访问的问题