zoukankan      html  css  js  c++  java
  • bzoj1563: [NOI2009]诗人小G

    f[i]表示前i句诗的最小不协调度,f[i]=min(0<=j<i){f[j]+|s[i]-s[j]+i-j-1-L|^p}

    val(j,i)=|s[i]-s[j]+i-j-1-L|^p 满足四边形不等式

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long double LD;
    int P;
    LD quick_pow(LD A)
    {
        LD ret=1;int p=P;
        while(p!=0)
        {
            if(p%2==1)ret*=A;
            A*=A;p/=2;
        }
        return ret;
    }
    
    int n,s[110000];LD L,f[110000];
    LD myabs(LD x){return x<0?-x:x;}
    LD val(int j,int i){return quick_pow(myabs(s[i]-s[j]+i-j-1-L));}
    struct node
    {
        int id,l,r;
        node(){}
        node(int ID,int L,int R){id=ID;l=L;r=R;}
    }q[110000];int h,t;
    
    char ss[3100000];
    int main()
    {
        freopen("poet.in","r",stdin);
        freopen("poet.out","w",stdout);
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%Lf%d",&n,&L,&P);
            s[0]=0;
            for(int i=1;i<=n;i++)
                scanf("%s",ss+1), s[i]=s[i-1]+strlen(ss+1);
            
            h=1,t=0;q[++t]=node(0,0,n);
            for(int i=1;i<=n;i++)
            {
                if(q[h].r<i)h++;
                q[h].l=i;f[i]=f[q[h].id]+val(q[h].id,i);
                
                if(h>t||f[i]+val(i,n)<=f[q[t].id]+val(q[t].id,n))
                {
                    while(h<=t&&f[i]+val(i,q[t].l)<=f[q[t].id]+val(q[t].id,q[t].l))t--;
                    if(h>t)q[++t]=node(i,1,n);
                    else
                    {
                        int l=q[t].l,r=q[t].r,ans;
                        while(l<=r)
                        {
                            int mid=(l+r)/2;
                            if(f[i]+val(i,mid)>f[q[t].id]+val(q[t].id,mid))
                            {
                                ans=mid;
                                l=mid+1;
                            }
                            else r=mid-1;
                        }
                        q[t].r=ans;
                        q[++t]=node(i,ans+1,n);
                    }
                }
            }
            if(f[n]>1e18)printf("Too hard to arrange
    ");
            else printf("%lld
    ",(long long)f[n]);
            printf("--------------------
    ");
        }
        return 0;
    }
  • 相关阅读:
    How to clean up BizTalk Message Box
    BizTalk: Database ‘BizTalkMsgBoxDb’ is full
    Install or Uninstall a Windows Service
    Distinguished Fields and Optional Elements
    Stay Hungry, Stay Foolish
    男子英文名大全,来历、释义
    Correlations in BizTalk 2004
    17.域环境解决方案
    18.windows痕迹清理
    Burpsuit手机抓包
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9479818.html
Copyright © 2011-2022 走看看