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

题目大意:玩具装箱,然而指数变成了p(p≤10)

首先我们需要证明决策单调

由于数死早,还是戳这里

知道决策单调之后怎么办呢?

由于是1D1D,所以不能分治了

每个决策点能决策的区间一定是连续的一段

并且随着决策点的右移 这个区间也在不断右移

令g[j]表示决策点j能贡献的最左侧的位置

然后我们开一个栈来维护当前存在贡献的贡献点

那么显然stack[i]的贡献区间是[g[stack[i]],g[stack[i+1]]?1]

每新来一个点,首先在栈中二分找到最优决策点

然后将所有满足

f[stack[top]]+W(stack[top],g[stack[top]])>f[i]+W(i,g[stack[top]])

的栈顶弹掉

然后二分找到最左侧的位置pos满足

f[stack[top]]+W(stack[top],pos)>f[i]+W(i,pos)

那么这个pos就是g[i],如果能找到这个pos,就将i压栈

由于数字可能过大因此要用long double代替long long进行计算

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
#define LIMIT 1000000000000000000ll
using namespace std;
typedef long double ld;
int n,l,p;
int sum[M],g[M],stack[M],top;
ld f[M];
long double Slow_Power(long double x,int y)
{
    long double re=1;
    for(int i=1;i<=y;i++)
        re*=x;
    return re;
}
int Get_Len()
{
    static char s[40];
    scanf("%s",s+1);
    return strlen(s+1);
}
int Get_Pos(int x)
{
    int l=1,r=top;
    while(r-l>1)
    {
        int mid=l+r>>1;
        if( g[stack[mid]]<=x )
            l=mid;
        else
            r=mid;
    }
    return g[stack[r]]<=x?r:l;
}
ld F(int j,int i)
{
    return f[j]+Slow_Power(fabs(sum[i]-sum[j]+(i-j-1)-l),p);
}
int Get_G(int x,int y)
{
    int l=max(g[x],y)+1,r=n+1;
    while(r-l>1)
    {
        int mid=l+r>>1;
        if( F(y,mid) < F(x,mid) )
            r=mid;
        else
            l=mid;
    }
    if(l==r) return r;
    return F(y,l) < F(x,l) ? l : r ;
}
int main()
{
    int T,i;
    for(cin>>T;T;T--)
    {
        cin>>n>>l>>p;
        for(i=1;i<=n;i++)
            sum[i]=sum[i-1]+Get_Len();
        g[0]=1;stack[top=1]=0;
        for(i=1;i<=n;i++)
        {
            int pos=stack[Get_Pos(i)];
            f[i]=F(pos,i);
            while( g[stack[top]]>i && F(i,g[stack[top]]) < F(stack[top],g[stack[top]]) )
                stack[top--]=0;
            pos=Get_G(stack[top],i);
            if(pos!=n+1)
            {
                stack[++top]=i;
                g[i]=pos;
            }
        }
        if(f[n]-0.5>LIMIT)
            puts("Too hard to arrange");
        else
            cout<<(long long)(f[n]+0.5)<<endl;
        puts("--------------------");
    }
    return 0;
}
时间: 2024-10-14 01:01:58

BZOJ 1563 NOI2009 诗人小G 四边形不等式的相关文章

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

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

【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

题解——[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之前的点更新,这就是决策单调性.那么我

BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<

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

四边形不等式优化

四边形不等式优化条件(转自这里) 在动态规划中,经常遇到形如下式的转台转移方程: m(i,j)=min{m(i,k-1),m(k,j)}+w(i,j)(i≤k≤j)(min也可以改为max) 上述的m(i,j)表示区间[i,j]上的某个最优值.w(i,j)表示在转移时需要额外付出的代价.该方程的时间复杂度为O(N^3). 下面我们通过四边形不等式来优化上述方程,首先介绍什么是"区间包含的单调性"和"四边形不等式" (1)区间包含的单调性:如果对于i≤i'<j≤

codeforces 321E Ciel and Gondolas 四边形不等式

题目大意:给定n个人,需要分k次过河,两个人i,j如果同乘一条船就会产生ai,j的代价,求最终代价的最小值 这个玩应显然满足四边形不等式(虽然我并不知道这个不等式是啥 然后就是决策单调(虽然我并不知道为何满足四边形不等式一定决策单调 然后就能分治做辣... 定义Solve(l,r,optl,optr)表示当前在处理区间[l,r],最优决策区间为[optl,optr] 然后我们用区间[optl,min(optr,mid?1)]的f值来更新f[mid],并记录最优决策点pos 那么[l,mid?1]