【BZOJ 1563】 [NOI2009]诗人小G

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
--------------------
1000000000000000000
--------------------

【样例说明】
前两组输入数据中每行的实际长度均为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。

题解如下

ttps://www.byvoid.com/blog/noi-2009-poet

我只放AC代码

 1 #include<cstdio>
 2 #include<cstring>
 3 #define ll long double
 4 struct node{int  l,r,p;}q[100100];
 5 #define MAX 1000000000000000000LL
 6 #define N 100100
 7 ll sum[N],f[N];
 8 int n,l,p,T;
 9 char ch[35];
10 ll pow(ll y){
11     if(y<0)y=-y;
12     ll ans=1;
13     for (int i=1;i<=p;i++) ans*=y;
14     return ans;
15 }
16
17 ll calc(int x,int y){
18     return f[x]+pow(sum[y]-sum[x]+(y-x-1)-l);
19 }
20
21 int find(node t,int x){
22     int l=t.l,r=t.r;
23     while(l<=r){
24         int mid=(l+r)>>1;
25         if (calc(x,mid)<=calc(t.p,mid)) r=mid-1;
26         else l=mid+1;
27     }
28     return l;
29 }
30
31 void dp(){
32     int head=1,tail=0;
33     q[++tail]=(node){0,n,0};
34     for (int i=1;i<=n;i++){
35         if(q[head].r<i&&head<=tail) head++;
36         f[i]=calc(q[head].p,i);
37         if (head>tail||calc(i,n)<=calc(q[tail].p,n)){
38             while(head<=tail&&calc(q[tail].p,q[tail].l)>=calc(i,q[tail].l)) tail--;
39             if(head>tail)q[++tail]=(node){i,n,i};
40             else{
41                 int x=find(q[tail],i);
42                 q[tail].r=x-1;
43                 q[++tail]=(node){x,n,i};
44             }
45         }
46     }
47 }
48
49 int main(){
50     scanf("%d",&T);
51     while(T--){
52         scanf("%d%d%d",&n,&l,&p);
53         for (int i=1;i<=n;i++) scanf("%s",ch),sum[i]=sum[i-1]+strlen(ch);
54         dp();
55         if(f[n]>MAX)
56             puts("Too hard to arrange");
57         else
58             printf("%lld\n",(long long)f[n]);
59         puts("--------------------");
60     }
61 }
时间: 2024-08-25 03:01:51

【BZOJ 1563】 [NOI2009]诗人小G的相关文章

BZOJ 1563 NOI2009 诗人小G 四边形不等式

题目大意:玩具装箱,然而指数变成了p(p≤10) 首先我们需要证明决策单调 由于数死早,还是戳这里吧 知道决策单调之后怎么办呢? 由于是1D1D,所以不能分治了 每个决策点能决策的区间一定是连续的一段 并且随着决策点的右移 这个区间也在不断右移 令g[j]表示决策点j能贡献的最左侧的位置 然后我们开一个栈来维护当前存在贡献的贡献点 那么显然stack[i]的贡献区间是[g[stack[i]],g[stack[i+1]]?1] 每新来一个点,首先在栈中二分找到最优决策点 然后将所有满足 f[sta

Bzoj 1563: [NOI2009]诗人小G(决策单调性优化)

原题面 带有详细证明的转这里 题意:每一个线段有一个长度,有一个标准长,现在要把这些线段按照顺序分行,每行的不和谐值等于标准长和该行线段总长的差的绝对值的p次方.现在要求最小的不和谐值之和. 开始的时候完全读错题了,以为p==2 for ever.真是太天真.后来看数据范围才发现.我真是面向数据编程? n^2的dp是一眼秒的.然后如果是p=2,那就是一个非常像玩具装箱的斜率优化dp.对于4.5的数据范围.可以想到用贪心优化dp.因为每一行的长度不会通过拼接线段(线段条数>=2)达到2*标准长,这

题解——[NOI2009]诗人小G 决策单调性优化DP

第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1))); 其中f[i]代表到了第i个句子的最小答案 qpow用于处理^p sum为前缀和 (同时为了处理句子之间的空格问题,我们在统计前缀和的时候就默认在句子后面加一个空格, 然后在计算的时候,由于每一行只有最后一个不用加空格,直接减掉这个多加的空格即可获得正确长度) 首先我们可以打表发现是满足决策单调性的,

BZOJ 1563 诗人小G(四边形优化)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1563 题意: 思路:设s[i]表示前i个句子的长度和,那么有转移方程: 有大牛证明这个满足四边形不等式,证明应该 比较复杂.在<1D/1D动态规划优化初步>这篇文章中,作者说实战中可以直接打表看看是不是满足,感觉还是比较实用的.不管那么多了,现在我们知道了满 足四边形不等式,也就是满足决策点单调.比如f[i]是用j更新的,那么i之后的点不可能用j之前的点更新,这就是决策单调性.那么我

NOI 2009A 诗人小G

NOI 2009A 诗人小G 诗人小G [问题描述] 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中, 注意一行中可以放的句子数目是没有限制的.小G给每首诗定义了一个行标准长度(行的长度为一行中符号的总个数),他希望排版后每行的长度都和行标准长度相差不远.显然排版时,不应改变原有的句子顺序,并且小G不允许把一个句子分在两行或者更多的行内.在满足上面两个条件的情况下,小G对于排

诗人小G(1D1D动态规划)

1D1D动态规划的转移式是长这样的: 对于形如f(i)=min(f(j)+w(j,i)) ,1<=i<=n-1f(i)=min(f(j)+w(j,i)),1<=i<=n?1的状态转移方程,记p[i]p[i]为令f[i]f[i]取到最小值的jj的值,即p[i]p[i]是f[i]f[i]的最优决策.若pp在[1,N][1,N]上单调不见,则称f具有决策单调性 其中 w[i,x]需要满足四边形不等式 emmm四边形不等式是什么呢? 对于定义域上的任意整数a,b,c,d,其中a\le b

ACM_小G的循环

小G的循环 Time Limit: 2000/1000ms (Java/Others) Problem Description: 一回生,二回熟,三回就腻,小G用for,while循环用得太多了,累觉不爱.于是自定义了一个循环,叫circle,形式如下: void circle(int n) { n--; if(n == 0) return; else circle(n); } 已知循环次数为该函数的调用次数,现在输入n(-2^31< =n< =2^31-1),求circle()的循环次数.

ACM_开挂的小G

开挂的小G Time Limit: 2000/1000ms (Java/Others) Problem Description: 小G寒假在家没网络,闲着没事干又看不下书,就玩起了单机游戏ACM_Game,不过,学计算机的怎么能老玩别人的游戏呢?自己做个?哦不,自己做的要是玩得不开心就会随便改代码啦,这样就没意思了.于是,小G费了点心思就给自己做了个ACM_Game辅助,让自己角色的分数快速增长.有多快呢?程序运行后,第一秒增加1,第2秒增加4,第3秒增加9... 第n秒就增加n^2.小G知道,

Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文件:transform.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换序列T.如果有多个满足条