NOI2009 诗人小G
Sol
决策单调性+二分
传说中的四边形不等式...其实做了这道题还是不会...
证明简直吃屎//// 贴个传送门这里有部分分做法还有决策单调性的证明 byvoid
ISA tell me that these problem could make a list to find DanDiaoXing.
(由于...导致我可以放个表上来...)
打表程序
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; #define debug(a) cout<<#a<<"="<<a<<" "
const int N = 105;
typedef long long LL; LL T,n,l,p;
LL sum[N],f[N],g[N]; LL pow(LL x){
if(x<0) x=-x;LL res=1;
for(int i=1;i<=p;i++) res=res*x;
return res;
}
LL F(int i,int j){ return f[j]+pow(sum[i]-sum[j]+i-j-1-l); }
int main(){
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
for(cin>>T;T--;){
cin>>n>>l>>p;
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+2;
memset(f,0x7f,sizeof(f));f[0]=0;
for(int i=1;i<=n;i++) for(int j=0;j<i;j++) if(f[i]>F(i,j)) g[i]=j,f[i]=F(i,j);
debug(n),debug(l),debug(p);cout<<endl<<"f[i]"<<endl;
for(int i=1;i<=n;i++) cout<<f[i]<<" ";cout<<endl;
cout<<"/////////////////////"<<endl;
cout<<endl<<"g[i]"<<endl;
for(int i=1;i<=n;i++) cout<<g[i]<<" ";
// cout<<"/////////////////////"<<endl;
cout<<endl<<"**************************************************"<<endl;
}
return 0;
}
输入文件
10
10 3 1
10 3 2
10 3 3
10 3 4
10 3 5
10 3 6
10 3 7
10 3 8
10 3 9
10 3 10
输出文件
n=10 l=3 p=1
f[i]
1 2 3 4 5 6 7 8 9 10
///////////////////// g[i]
0 0 1 2 3 4 5 6 7 8
**************************************************
n=10 l=3 p=2
f[i]
1 2 3 4 5 6 7 8 9 10
///////////////////// g[i]
0 1 2 3 4 5 6 7 8 9
**************************************************
n=10 l=3 p=3
f[i]
1 2 3 4 5 6 7 8 9 10
///////////////////// g[i]
0 1 2 3 4 5 6 7 8 9
**************************************************
n=10 l=3 p=4
f[i]
1 2 3 4 5 6 7 8 9 10
///////////////////// g[i]
0 1 2 3 4 5 6 7 8 9
**************************************************
n=10 l=3 p=5
f[i]
1 2 3 4 5 6 7 8 9 10
///////////////////// g[i]
0 1 2 3 4 5 6 7 8 9
**************************************************
n=10 l=3 p=6
f[i]
1 2 3 4 5 6 7 8 9 10
///////////////////// g[i]
0 1 2 3 4 5 6 7 8 9
**************************************************
n=10 l=3 p=7
f[i]
1 2 3 4 5 6 7 8 9 10
///////////////////// g[i]
0 1 2 3 4 5 6 7 8 9
我们可以发现每个点的最优决策点g[i]是单调递增的...
但是我一开始天真的认为点i的能作为最优决策点的起始位置也是单调递增的,显然他是一个凹或凸函数,并不具有单调性,意思就是我们需要维护一个双端队列用来作为最优决策点的转移.
每次入队都需要对于队尾元素进行出队操作,就是判断该点作为最优决策点的起始位置是否比队尾元素最优决策点的起始位置更靠左,如果是,就进行出队操作.
然后二分一下,它作为最优决策的位置.
PS:long long存不下,double也存不下,需要long double,亲测.
Code
#include<cstdio>
#include<utility>
#include<cstring>
#include<iostream>
using namespace std; #define mpr(a,b) make_pair(a,b)
const int N = 100005;
const double lim = 1e18;
typedef long long LL; int n,l,p,h,t;
LL sum[N];
int len[N],q[N],L[N],R[N];
long double f[N]; inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
long double MyPow(long double x){
long double a=1;if(x<0) x=-x;
for(int i=1;i<=p;i++) a=a*x;
return a;
}
long double F(int i,int j){ return f[j]+MyPow(sum[i]-sum[j]+i-j-1-l); }
int main(){
// freopen("in.in","r",stdin);
for(int T=in();T--;puts("--------------------")){
n=in(),l=in(),p=in();
char tmp[50];
for(int i=1;i<=n;i++){
scanf("%s",tmp);
len[i]=strlen(tmp);
sum[i]=sum[i-1]+len[i];
}
h=t=1,q[t]=0;L[h]=1,R[h]=n;
for(int i=1;i<=n;i++){
while(R[h]<i) h++;
f[i]=F(i,q[h]);
while(L[t]>i&&F(L[t],q[t])>F(L[t],i)) R[t-1]=R[t],t--;
int ll=L[t],rr=R[t],mm;
while(ll<=rr){
mm=(ll+rr)>>1;
if(F(mm,q[t])<=F(mm,i)) ll=mm+1;
else rr=mm-1;
}if(ll<=R[t]){ L[++t]=ll,R[t]=R[t-1],R[t-1]=ll-1,q[t]=i; }
}
if(f[n]>lim) puts("Too hard to arrange");
else printf("%lld\n",(long long)f[n]);
}
return 0;
}
NOI2009 诗人小G的更多相关文章
- 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是一个出色的诗人,经常作诗自娱自乐. 但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并 ...
- P1912 [NOI2009]诗人小G
P1912 [NOI2009]诗人小G 思路: 平行四边形不等式优化dp 因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式 j < i f( ...
- LG1912 [NOI2009]诗人小G
题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...
- [NOI2009] 诗人小G [题解]
诗人小G 题目大意 给出 \(n\) 个长度不超过 \(30\) 的句子,要求你对其进行排版. 对于每一行,有一个规定的行标准长度 \(L\) ,每一行的不协调度等于该行的实际长度与行标准长度差的绝对 ...
- 不失一般性和快捷性地判定决策单调(洛谷P1912 [NOI2009]诗人小G)(动态规划,决策单调性,单调队列)
洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要 ...
- 【BZOJ 1563】 [NOI2009]诗人小G
Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...
- bzoj1563: [NOI2009]诗人小G
Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...
随机推荐
- JavaWeb学习笔记——开发动态WEB资源(七)bookapp
该工程的功能是实现一个bookapp 1.开发注册页面,注册使用properties文件,存储在classpath跟路径 2.注册成功跳转到登录页面 3.输入用户名密码登录,登录成功跳转到book显示 ...
- 商城常用css分类代码
如图: 原代码如下: <div class="allMerchan bgnone"> <h2 class="ttlm_category"> ...
- Struts2版本配置2.1以前与以后---关于filter的配置
严重: Dispatcher initialization failed java.lang.RuntimeException JavaStrutsfreemarkerApacheXML 严重: D ...
- Logback LogBack
1.简介 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的) 1.1 LogBac ...
- WinForm中新开一个线程操作 窗体上的控件(跨线程操作控件)
最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录窗体的显示,开了一个线程去加载数据远程的数据,会报一个错误"线程间操作无效: 从不是 ...
- NIOS ii 流水灯
为了做项目的前期验证工作,实验室购买了某开发板,下面是基于该板子的实现过程.作为笔记记录,供入门者参考. 1:创建一个Quartus II的工程 next选择器件,然后finish.我的器件是cycl ...
- php apache用户写文件夹权限设置
php一般是以apache用户身份去执行的,把apache加入到存储你文件的父文件夹属组里去,然后改该父文件夹权限为775,这样属组成员就有写的权限,而apache属于这个组就可以改写该目录下所有文件 ...
- solr6.1-----solrJ 程序管理索引库
solrJ 是solr 提供的一个客户端,就是一个jar 包,把jar 添加到工程中整合solr 服务. 所需jar 包 D:\solr-6.1.0\dist 下面的 solr-solrj-6.1.0 ...
- 【Solr】 solr对拼音搜索和拼音首字母搜索的支持
问:对于拼音和拼音首字母的支持,当你在搜商品的时候,如果想输入拼音和拼音首字母就给出商品的信息,怎么办呢? 实现方式有2种,但是他们其实是对应的. 用lucene实现 1.建索引, 多建一个索引字段 ...
- 【深入JVM内核—原理、诊断与优化】第2期开课了
[深入JVM内核—原理.诊断与优化]的讲师“葛一鸣”,人称“一哥”,毕业于浙江工业大学,计算机软件与理论专业硕士,是国家认证系统分析师,OCP.2012年出版过<Java程序性能优化>,荣 ...