bzoj5311: 贞鱼

还是年轻啊算的时候少乘一个4000被卡二分上界了。。。%%%%bright教我超级快速读D飞bzoj垃圾卡常数据

我们容易写出这样的DP方程:f[i][j]=f[k][j-1]+val(k+1,j)

然后可以发现g(j)是单调减而且是下凸的

那么我们就可以愉快的上wqs二分了

那么f[i]就表示无限分最优解,就有f[i]=f[j]+val(j+1,i)+C

而这个明显是四边形不等式优化的形式

O(nlognlogw)踩了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;

const int MAXSIZE=1<<15;
char buf[MAXSIZE],*p1=buf,*p2=buf;
#define gc p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXSIZE,stdin),p1==p2)?EOF:*p1++
int read()
{
    int x=0,f=1;char ch=gc;
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=gc;}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=gc;}
    return x*f;
}

int n,s[4100][4100];
int val(int j,int i){return (s[i][i]-s[i][j]-s[j][i]+s[j][j])/2;}
struct node
{
    int l,r,id;
    node(){}
    node(int L,int R,int ID){l=L;r=R;id=ID;}
}q[4100];int f[4100],g[4100];
void check(int C)
{
    int h=1,t=0;q[++t]=node(1,n,0);
    f[0]=0;g[0]=0;
    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)+C;
        g[i]=g[q[h].id]+1;

        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(1,n,i);
            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(ans+1,n,i);
            }
        }
    }
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    int K;
    n=read(),K=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            s[i][j]=read();
            s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
        }

    int l=0,r=(1<<30)-1,ans;
    while(l<=r)
    {
        int mid=(l+r)/2;
        check(mid);
        if(g[n]>=K)
        {
            ans=f[n]-K*mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/AKCqhzdy/p/9898197.html

时间: 2024-10-10 05:32:22

bzoj5311: 贞鱼的相关文章

贞鱼传教&amp;&amp;贞鱼传教(数据加强版)

http://acm.buaa.edu.cn/problem/1381/ 贞鱼传教[问题描述] 新的一年到来了,贞鱼哥决定到世界各地传授“贞教”,他想让“贞教”在2016年成为世界第四大宗教.说干就干......贞鱼哥把即将接受传教的人排成一行,每个人从左到右的编号为1-n.每个人有一个信仰值,一开始所有人的信仰值为0.接着贞鱼哥会做以下两件事之一: 1.贞鱼哥向连续的一段人群传教.具体来说,贞鱼哥会使第l个人到第r个人之间的所有人的信仰值增加k. 2.贞鱼哥想知道某一段人的信仰值之和,于是他想

ROJ 1166 超级贞鱼

1166: 超级贞鱼 Time Limit: 1 Sec  Memory Limit: 128 MB [Submit][Status] 传送门 Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上个有一个数.有一天,K只贞鱼兴致来潮(1≤k≤10^5),排成一列,从左到右第i只贞鱼会在右脚写Ai(1≤Ai≤10^9),左脚上写上i(1≤i≤K),第二年,这K只贞鱼按右脚的数从小到大排成一列,然后,它们决定重编号,从左到右第i只贞鱼会在右脚

bzoj 4769: 超级贞鱼 -- 归并排序

4769: 超级贞鱼 Time Limit: 1 Sec  Memory Limit: 128 MB Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上个有一个数.有一天,K只贞鱼兴致来潮(1≤k≤10^5),排成一列,从左到右第i只贞鱼会在右脚写Ai(1≤Ai≤10^9),左脚上写上i(1≤i≤K),第二年,这K只贞鱼按右脚的数从小到大排成一列,然后,它们决定重编号,从左到右第i只贞鱼会在右脚上写上左脚的数,在左脚上写i,第三年,它们

【BZOJ4769】超级贞鱼 归并排序求逆序对

[BZOJ4769]超级贞鱼 Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上各有一个数.有一天,K只贞鱼兴致来潮,排成一列,从左到右第i只贞鱼会在右脚写Ai,左脚上写上i:第二年,这K只贞鱼以右脚的数为第一关键字.左脚的数为第二关键字,从小到大排成一列.然后,它们决定重编号,从左到右第i只贞鱼会在右脚上写上左脚的数,在左脚上写i:第三年,它们按第二年的方法重排列.重编号......N年后,对于从左到右第i和第j贞鱼,若i<j且第i只

WQS二分题集

WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收益,转移即可.复杂度O(n^2). 那么,如果在某些情况下,可以通过将问题稍作转化,变成一个不强制选k个的DP,而最后DP出来的最优解一定正好选了k个,那么问题就会简化很多. WQS二分就是基于这个思想. 首先考虑建一个二维坐标系,x轴是选的数的个数,y轴是最大收益,如果这个x-y图像有凸性,那么就

带权二分

带权二分 一种二分答案的套路,又叫做DP凸优化,wqs二分. 用来解决一类题目,要求某个要求出现K次,并且,可以很显然的发现,在改变相应权值的时候,对应出现的次数具有单调性.而且很显然,这种题一般满足一定的要求.而且一般权值为整数二分就可以,但是有的题需要实数二分...而且,边界条件通常很麻烦,调起来想摔电脑. 例题时间: BZOJ2654: tree 题目大意:给你一个图,里面有白色边和黑色边,问恰好有k条边白色边的最小生成树 直接贪心法肯定是错误的,因此,我们考虑带权二分. 给定一个选择白色

十日均线炒股法与鱼身理论

原作者地址 http://blog.163.com/zpz_ok/blog/static/17348427020101083371181/ 担心掉了,copy过来. 十日均线炒股法与鱼身理论:读到这里,一定会有人问:如果按十日均线炒股法,非要等到股价涨到十日均线上才买,往往已经损失了从最低价上来的一段盈利:再跌破十日均线后才卖,又损失了从最高价下来这一段盈利,这样操作是不是太死板了? 我会反问:你在吃鱼的时候是先吃鱼身还是先吃鱼头鱼尾?恐怕大多数人会回答:肯定是先吃鱼身了.我的回答也一样:当然是

TYVJ P1736 创意吃鱼法 Label:dp || 前缀和

题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1表示对应位置有鱼)有助于决定吃鱼策略. 在代表池子的01矩阵中,有很多的正方形子矩阵,如果某个正方形子矩阵的某条对角线上都有鱼,且此正方形子矩阵的其他地方无鱼,猫猫就可以从这个正方形子矩阵“对角线的一端”下口,只一吸,就能把对角线上的那一队鲜鱼吸入口中. 猫猫是个贪婪的家伙,所以她想一口吃掉尽量多的

HTML5“爱心鱼”游戏总结

HTML5“爱心鱼”游戏总结 目录 1.页面搭建 2.画蓝色的海洋 3.画随海水摆动的漂浮物 4.画随海水摆动的海葵 5.画静态的大鱼 6.鼠标控制大鱼的游向 7.给大鱼加基本动画(眼睛眨动,尾巴不停的摇摆) 8.画静止的小鱼 9.小鱼跟随大鱼游动 10.给小鱼加基本动画(眼睛眨动,尾巴不停的摇摆) 11.画果实 12.大鱼吃果实.大鱼喂小鱼 13.特效(大鱼吃果实产生白色涟漪,大鱼喂小鱼产生橙色涟漪) 14.游戏分值计算和小鱼生命值判断 15.游戏开始前的处理 16.游戏结束后的处理 游戏演示