P1912 [NOI2009]诗人小G
思路:
平行四边形不等式优化dp
因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式
j < i
f(j, i+1) + f(j+1, i) >= f(j, i) + f(j+1, i+1)
所以dp[i]具有决策单调性
代码:
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
using namespace std;
#define y1 y11
#define fi first
#define se second
#define pi acos(-1.0)
#define LL long long
#define LD long double
//#define mp make_pair
#define pb push_back
#define ls rt<<1, l, m
#define rs rt<<1|1, m+1, r
#define ULL unsigned LL
#define pll pair<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<int, pii>
#define pdd pair<long double, long double>
#define mem(a, b) memset(a, b, sizeof(a))
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
//head const int N = 1e5 + ;
const LL UP = 1e18;
string s[N];
int T, n, l, p, sum[N], pre[N];
LD dp[N];
vector<int> vc;
struct Node {
int l, r, j;
};
deque<Node> q;
inline LD Pow(int x) {
LD res = ;
for (int i = ; i <= p; ++i) res *= x;
return res;
}
inline LD cal(int j, int i) {
return dp[j] + Pow(abs(sum[i]-sum[j]+i-j--l));
}
inline int srch(int l, int r, int i, int j) {
int m = l+r >> ;
while(l < r) {
if(cal(i, m) <= cal(j, m)) r = m;
else l = m+;
m = l+r >> ;
}
return m;
}
int main() {
fio;
cin >> T;
while(T--) {
cin >> n >> l >> p;
for (int i = ; i <= n; ++i) cin >> s[i];
for (int i = ; i <= n; ++i) sum[i] = sum[i-] + s[i].size();
while(!q.empty()) q.pop_back();
q.push_back({, n, });
dp[] = ;
for (int i = ; i <= n; ++i) {
if(q.front().r == i-) q.pop_front();
else q.front().l = i;
pre[i] = q.front().j;
dp[i] = cal(q.front().j, i);
int pos = -;
while(!q.empty()) {
if(cal(i, q.back().l) <= cal(q.back().j, q.back().l)) {
pos = q.back().l;
q.pop_back();
}
else {
if(cal(i, q.back().r) <= cal(q.back().j, q.back().r)) {
pos = srch(q.back().l, q.back().r, i, q.back().j);
q.back().r = pos-;
q.push_back({pos, n, i});
}
else {
if(~pos) q.push_back({pos, n, i});
break;
}
}
} }
if(dp[n] > UP) cout << "Too hard to arrange\n";
else {
cout <<fixed<<setprecision()<< dp[n] << "\n";
int now = n;
while(now) {
vc.pb(now);
now = pre[now];
}
vc.pb();
reverse(vc.begin(), vc.end());
for (int i = ; i < vc.size(); ++i) {
for(int j = vc[i-]+; j <= vc[i]; ++j) {
cout << s[j];
if(j != vc[i]) cout << " ";
else cout << "\n";
}
}
vc.clear();
}
cout << "--------------------\n";
}
return ;
}
P1912 [NOI2009]诗人小G的更多相关文章
- 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)
洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...
- 洛谷P1912 [NOI2009]诗人小G(决策单调性)
传送门 题解 决策单调性是个啥……导函数是个啥……这题解讲的是啥……我是个啥…… //minamoto #include<iostream> #include<cstdio> ...
- P1912 [NOI2009]诗人小G[决策单调性优化]
地址 n个数划分若干段,给定$L$,$p$,每段代价为$|sum_i-sum_j-1-L|^p$,求总代价最小. 正常的dp决策单调性优化题目.不知道为什么luogu给了个黑题难度.$f[i]$表示最 ...
- bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...
- 1563: [NOI2009]诗人小G
1563: [NOI2009]诗人小G https://lydsy.com/JudgeOnline/problem.php?id=1563 分析: 直接转移f[i]=f[j]+cost(i,j),co ...
- [NOI2009]诗人小G --- DP + 决策单调性
[NOI2009]诗人小G 题目描述: 小G是一个出色的诗人,经常作诗自娱自乐. 但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并 ...
- LG1912 [NOI2009]诗人小G
题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...
- [NOI2009] 诗人小G [题解]
诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...
- NOI2009 诗人小G
Sol 决策单调性+二分 传说中的四边形不等式...其实做了这道题还是不会... 证明简直吃屎//// 贴个传送门这里有部分分做法还有决策单调性的证明 byvoid ISA tell me that ...
随机推荐
- CentOS7.5安装GitLab及汉化
一.GitLab英文版安装 1.下载gitlab安装包,然后安装 wget --content-disposition https://packages.gitlab.com/gitlab/gitla ...
- python3 安装pip提示没有distutils.util模块错误的解决
Python3 安装pip 提示ModuleNotFoundError: No module named 'distutils.util' 环境ubutun14,python版本是python3. ...
- 动态中位数-POJ 3784
题目: 依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数P,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一 ...
- TCP为什么要三次握手?
在<计算机网络>一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是: 一端(client)A发出去的第一个连接请求报文并没有丢 ...
- java中序列化的作用
一 什么叫序列化 通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输. 二 序列化有什么作用 1.方便传输,速度快,还很安全,被调用方序列化,调用方反 ...
- 【AC自动机】玄武密码
[题目链接] https://loj.ac/problem/10058 [题意] 对于每一段文字,其前缀在母串上的最大匹配长度是多少呢 [参考别人的题解] https://www.luogu.org/ ...
- 代理模式与动态代理之JDK实现和CGlib实现
静态代理 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 由业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理, ...
- vue之多页面的开发
我们平常用vue开发的时候总觉得vue好像就是专门为了单页面应用而诞生的,其实不是.因为vue在工程化开发的时候很依赖webpack,而webpack是将所有的资源整合到一块,弄成一个单页面.但是vu ...
- linux脚本监控应用且通过邮件报警异常
一.背景 最近接到监控应用并通过邮件报警的任务,由于需求比较简单,故没有使用springboot那套,而是采用linux脚本的方式进行监控. 二.思路 通过linux自带的定时功能,定时执行一个lin ...
- mybatis的BLOB存储与读取
http://blog.csdn.net/luyinchangdejiqing/article/details/45096689 简单介绍一下背景环境,web开发避免不了照片附件之类的东东,原先是存到 ...