这里是\(sb\)的\(O(nm)\)做法

上一篇题解里写的\(O(nm)\)做法并没有看懂,我真是好菜啊

这是一个用了斜率优化,但是复杂度仍然是\(O(nm)\)的做法

我们还是先写出简单的\(dp\)方程

\(dp[i]\)表示到达第\(i\)个点的时候的最大收益

于是就有

\[dp[i]=max(dp[j]+w[i]-(a[i].x-a[j].x)^2-(a[i].y-a[j].y)^2)
\]

显然暴力转移是\(O(n^2)\)的

我们发现\(m\)非常的小,于是我们可以考虑一下把\(n\)优化成\(m\)

我们先将整个矩阵破坏成一条链,之后给每一个点一个新编号,对于原来的点\((x,y)\),新编号就是\((x-1)*m+y\),我们按照新编号给点从小到大排序

于是我们按照这个样子来进行\(dp\)的话就可以方便的找到某个点右上的所有点了

我们可以开上\(m\)个队列,第\(i\)个队列\(q[i]\)存储的是\(i\)这一列上面所有的点

于是我们更新一个点的时候只需要去枚举它之前的所有列对应的队列就好了

之后我们就可以来斜率优化了

由于我们枚举的是列数,那么\((a[i].y-a[j].y)^2\)就固定了,为了方便化柿子,我们设\(c=(a[i].y-a[j].y)^2\)

于是就有

\[dp[i]=dp[j]+w[i]-c-(a[i].x-a[j].x)^2
\]

\[dp[i]=dp[j]+w[i]-c-a[i].x^2-a[j].x^2+2*a[i].x*a[j].x
\]

\[-2*a[i].x*a[j].x+dp[i]+c-w[i]=dp[j]-a[j].x^2
\]

这个柿子显然可以列率优化,截距为\(dp[i]+c-w[i]\),斜率为\(-2*a[i].x\)由于斜率单减,我们要求最大化截距,所以维护一个上凸壳就好了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define re register
#define maxn 1005
#define max(a,b) ((a)>(b)?(a):(b))
inline int read()
{
char c=getchar();
int x=0,r=1;
while(c<'0'||c>'9')
{
if(c=='-') r=-1;
c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
struct Point
{
int x,y,rk;
int w;
}a[200005];
int dp[200005];
int q[maxn][maxn],head[maxn],tail[maxn];
inline int cmp(Point K,Point M)
{
return K.rk<M.rk;
}
#define X(i) (a[i].x)
#define Y(i) (dp[i]-a[i].x*a[i].x)
inline double K(int i,int j)
{
return double(Y(i)-Y(j))/double(X(i)-X(j));
}
int n,m;
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++)
{
a[i].x=read(),a[i].y=read(),a[i].w=read();
a[i].rk=(a[i].x-1)*m+a[i].y;
}
std::sort(a+1,a+n+1,cmp);
memset(dp,-20,sizeof(dp));
dp[1]=a[1].w;
q[1][++tail[1]]=1;
for(re int i=2;i<=n;i++)
{
int T=a[i].y;
for(re int j=1;j<=T;j++)
{
int c=(T-j)*(T-j);
while(head[j]<tail[j]&&-2*a[i].x<K(q[j][head[j]],q[j][head[j]+1])) head[j]++;
dp[i]=max(dp[i],dp[q[j][head[j]]]+a[i].w-c-(a[q[j][head[j]]].x-a[i].x)*(a[q[j][head[j]]].x-a[i].x));
}
while(head[T]<tail[T]&&K(i,q[T][tail[T]-1])>K(q[T][tail[T]],q[T][tail[T]-1])) tail[T]--;
q[T][++tail[T]]=i;
}
std::cout<<dp[n];
return 0;
}

【[JSOI2009]火星藏宝图】的更多相关文章

  1. bzoj 1560 [JSOI2009]火星藏宝图(DP)

    1560: [JSOI2009]火星藏宝图 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 647  Solved: 309[Submit][Status ...

  2. 【BZOJ1560】[JSOI2009]火星藏宝图(贪心,动态规划)

    [BZOJ1560][JSOI2009]火星藏宝图(贪心,动态规划) 题面 BZOJ 洛谷 题解 既然所有的位置的权值都大于\(0\),那么就可以直接贪心,按照行为第一关键字,列为第二关键字,来转移. ...

  3. bzoj1560:[JSOI2009]火星藏宝图(斜率优化)

    题目描述 在火星游玩多日,jyy偶然地发现了一张藏宝图.根据藏宝图上说法,宝藏被埋藏在一个巨大的湖里的N个岛上(2<=N<=200,000).为了方便描述,地图把整个湖划分成M行M列(1& ...

  4. bzoj1560: [JSOI2009]火星藏宝图

    考虑到一个性质,A到B的距离一定不小于A到C再到B的距离,因为能够到达这三个点不可能构成锐角三角形 对于当前点的更新只需要找那些无法经过其它点再到当前点的点,相当于是一个y坐标单调减的上凸包,随便维护 ...

  5. [luogu4056 JSOI2009] 火星藏宝图 (贪心 dp)

    传送门 Solution 一个显然的贪心:选的点数越多越好.这个随便推推就知道了. 那么我们就贪心的从一列上挑最靠下的转移 直接转移不斜率优化复杂度\(O(nm)\),吸一口O2过了... Code ...

  6. 【BZOJ1560】【JSOI2009】火星藏宝图 [DP]

    火星藏宝图 Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input Output Samp ...

  7. BZOJ 1560 火星藏宝图(DP)

    思路:发现如果从A能到B,B能到C,那么一定A能到C,且根据不等式:A^2+B^2<=(A+B)^2,而且权值没有负数,因此经过B比不经过B要优,因此,我们从左上到右下做,每一列,我们只记录之前 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

随机推荐

  1. oAuth2.0及jwt介绍

    oAuth2.0流程示意如下: 关于jwt介绍: 说明: 关于jwt简单说明一下,jwt即为json web token,是用来和服务端建立加密通信所使用的的一种“约定”,主要组成见上图即可.服务端一 ...

  2. 利用QVOD架设流媒体服务器/电影服务器/vod服务器

    电影服务器一点也不稀罕,是的我们见的太多了,但是大家有没有想过自己也能架一个这样的服务器? 当然现在架一个电影服务器不切实际,去年吵的闹哄哄的“视听许可证”想必大家有所耳闻,再加上电影对服务器的要求一 ...

  3. ssm集成redis

    身在一个传统的IT公司,接触的新技术比较少,打算年后跳槽,所以抽空学了一下redis. 简单的redis测试,咱们这边就不讲了,现在主要讲讲ssm集成redis的过程,因为现在项目用的就是ssm的框架 ...

  4. [LeetCode]Maximum Subarray题解

    Maximum Subarray: Find the contiguous subarray within an array (containing at least one number) whic ...

  5. eclipse的debug技巧之一

    如下图,断点设置的地方会在i==0时就停住,假如我们想在i等于某个值的时候才停住,那么可以添加“过滤条件” 具体操作是在debug模式下,右键breakpoints标签下我们所设置的断点,点击右键菜单 ...

  6. CentOS-Linux系统下安装Tomcat

    步骤1:解压Tomcat 命令: unzip apache-tomcat-8.5.20.zip 步骤2:将tomcat 移动到“/usr/local/src/java/tomcat8.5”下并重命名 ...

  7. BZOJ1053 [HAOI2007]反素数 & BZOJ3085 反质数加强版SAPGAP

    BZOJ 1053 Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x ...

  8. Linux VPS主机利用Crontab实现定时重启任务

    第一.安装Crontab可执行环境 一般的VPS/服务器是支持的,但是有些可能没有支持就需要我们来给予安装. A - centos系统 #安装Crontab yum install vixie-cro ...

  9. bootstrap 中的 iCheck 全选反选功能的实现

    喜欢bootstrap 风格的同学应该知道,iCheck的样式还是很好看的. 官网: http://www.bootcss.com/p/icheck/ 进入正题,iCheck提供了一些方法,可以进行全 ...

  10. latex 图形的放置

         Next: 16.3 清除未处理的浮动图形 Up: 16. 浮动图形环境 Previous: 16.1 创建浮动图形  16.2 图形的放置 图形(figure)环境有一个可选参数项允许用户 ...