题意: n×mn\times mn×m 的网格图,每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j​,bufi,j​,从 (1,1)(1,1)(1,1) 开始只能向下或向右走到 (n,m)(n,m)(n,m) ,在某个位置时可以选择触发该位置的事件(也可不触发),将获得 vali,jval_{i,j}vali,j​ 的得分和 bufi,jbuf_{i,j}bufi,j​ 的 buff,该 buff 会在之后每一步产生对应的分数直到触发下一个事件。求最大分数。

nm≤105nm\leq 10^5nm≤105,保证 val1,1=valn,m=buf1,1=bufn,m=0val_{1,1}=val_{n,m}=buf_{1,1}=buf_{n,m}=0val1,1​=valn,m​=buf1,1​=bufn,m​=0

显然可以 dp,设 f(x,y)f(x,y)f(x,y) 为走到 (x,y)(x,y)(x,y) 并触发事件的最大分数。

转移枚举上一个事件

f(x,y)=max⁡i≤x,j≤y{f(i,j)+buf(i,j)(x+y−i−j)}+val(i,j)f(x,y)=\max_{i\leq x,j\leq y}\{f(i,j)+buf(i,j)(x+y-i-j)\}+val(i,j)f(x,y)=i≤x,j≤ymax​{f(i,j)+buf(i,j)(x+y−i−j)}+val(i,j)

显然可以斜率优化

这个状态有两维,发现枚举的位置是满足二维偏序,所以可以 cdq 分治搞掉一维,另一维上李超线段树即可。

注意 000 和 −∞-\infin−∞ 的不同。

复杂度 O(nmlog⁡2n)O(nm\log ^2n)O(nmlog2n)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
using namespace std;
inline int read()
{int ans=0,f=1;char c=getchar();while (!isdigit(c)) (c=='-')&&(f=-1),c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return f*ans;
}
const int N=2e5,MAXN=N+5,INF=2e9;
int n,m;
vector<int> val[MAXN],buf[MAXN],f[MAXN];
int k[MAXN],b[MAXN],tot;
inline int calc(const int& i,const int& x){return k[i]*x+b[i];}
int ch[MAXN][2],mx[MAXN],rt,cnt;
inline void clear(){tot=0,rt=cnt=1,ch[1][0]=ch[1][1]=mx[1]=0;}
void modify(int& p,int l,int r,int v)
{if (!p) p=++cnt,ch[p][0]=ch[p][1]=mx[p]=0;if (!mx[p]) return (void)(mx[p]=v);if (calc(mx[p],l)>=calc(v,l)&&calc(mx[p],r)>=calc(v,r)) return;if (calc(mx[p],l)<=calc(v,l)&&calc(mx[p],r)<=calc(v,r)) return (void)(mx[p]=v);int mid=(l+r)>>1;if (calc(v,mid)>calc(mx[p],mid)) swap(v,mx[p]);if (calc(v,l)>calc(mx[p],l)) modify(ch[p][0],l,mid,v);if (calc(v,r)>calc(mx[p],r)) modify(ch[p][1],mid+1,r,v);
}
int query(int p,int l,int r,int k)
{if (!p) return -INF;int ans=(mx[p]? calc(mx[p],k):-INF);int mid=(l+r)>>1;if (k<=mid) ans=max(ans,query(ch[p][0],l,mid,k));else ans=max(ans,query(ch[p][1],mid+1,r,k));return ans;
}
void solve(int l,int r)
{if (l==r){clear();f[l][1]+=val[l][1];for (int i=1;i<=m;i++){if (i>1) f[l][i]=max(f[l][i],query(rt,1,N,i))+val[l][i];++tot,k[tot]=buf[l][i],b[tot]=f[l][i]-i*k[tot];modify(rt,1,N,tot);}return;}int mid=(l+r)>>1;solve(l,mid);clear();for (int j=1;j<=m;j++){for (int i=l;i<=mid;i++){++tot,k[tot]=buf[i][j],b[tot]=f[i][j]-(i+j)*k[tot];modify(rt,1,N,tot);}for (int i=mid+1;i<=r;i++) f[i][j]=max(f[i][j],query(rt,1,N,i+j));}solve(mid+1,r);
}
int main()
{n=read(),m=read();for (int i=1;i<=n;i++){buf[i].resize(m+1);for (int j=1;j<=m;j++) buf[i][j]=read();}for (int i=1;i<=n;i++){val[i].resize(m+1),f[i].resize(m+1,-INF);for (int j=1;j<=m;j++) val[i][j]=read();}f[1][1]=0;solve(1,n);printf("%d\n",f[n][m]);return 0;
}

【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】相关推荐

  1. 【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】

    题意:一个魔塔游戏的地图是一棵以 111 为根的树,起点为根,除根外每个结点有一个怪物,给定每个怪物血量.攻击.防御.奖励蓝宝石个数(加防御),勇士的血量.攻击.防御,遇到怪物必须战斗,勇士永远先手, ...

  2. 【牛客NOIP模拟】牛半仙的妹子序列【DP】【Segment Tree Beats】

    题意:排列的极长上升子序列个数 n≤2×105n\leq 2\times 10^5n≤2×105 显然有个 dp fn=∑i<n,pi<pn,∄i<j<ns.t. pi< ...

  3. 【牛客NOIP模拟】路径难题【建图】【最短路证明】

    题意:一张 nnn 个点 mmm 条边的无向图,边带距离,可以坐出租车,花费为距离除以常数 rrr 向上取整:也可以坐公交车,每路车行驶路线给定,无论坐多少站花费都为 cic_ici​ (每路车可能不 ...

  4. 2021牛客暑期多校训练营3 G-Yu Ling(Ling YueZheng) and Colorful Tree(cdq分治)

    G-Yu Ling(Ling YueZheng) and Colorful Tree HOWARLI题解 大致做法就是首先考虑哪些修改可能影响询问,当修改点权是询问的倍数时才可能影响询问.于是考虑把他 ...

  5. 牛客NOIP暑期七天营-提高组1

    牛客NOIP暑期七天营-提高组1 链接 A 边权可为0就排序建一条链子. 但是边权不为0 除了第一个有0的不行. x连向上一个比他小的数. 期间判断有无解. #include <bits/std ...

  6. 牛客练习赛58 C.矩阵消除游戏

    牛客练习赛58 C.矩阵消除游戏 题目链接 题目描述 牛妹在玩一个名为矩阵消除的游戏,矩阵的大小是n行m列,第i行第j列的单元格的权值为ai,ja_{i,j}ai,j​ ,牛妹可以进行k个回合的游戏, ...

  7. 【C语言刷题】牛客网编程入门130精选题目(二)

    牛客网编程入门130题–精选(二) 本篇文章衔接博客:牛客网编程入门130–精选(一) 文章目录 牛客网编程入门130题--精选(二) 题目OJ链接 1.图形相似度 2.有序数组中插入一个数 3.有序 ...

  8. 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)

    文章目录 前言 李超树 引入(斜率优化) 什么是李超树? 李超树活着能干点什么? 算法思想(使用手册?) 插入 查询 模板 判断是否覆盖(优不优) 插入 查询 例题 板题:BlueMary开公司 分析 ...

  9. 【2020牛客NOIP赛前集训营-提高组(第一场)题解】( 牛牛的方程式,牛牛的猜球游戏,牛牛的凑数游戏,牛牛的RPG游戏)

    未完待续... T1:牛牛的方程式 title solution code T2:牛牛的猜数游戏 title solution code T3:牛牛的凑数游戏 title solution code ...

最新文章

  1. Meta元宇宙OS要黄?300人研发团队解散,关闭VR/AR操作系统研发
  2. mybatis mysql方言_MyBatis 方言支持 - Mysql to 华为高斯数据库(gaussdb)
  3. sudo提升执行权限
  4. 数据结构C#版笔记--树与二叉树
  5. Atomikos 中文说明文档【转】
  6. pcm压缩 java,Java C.PcmEncoding方法代码示例
  7. 【python】有意思的python小项目GitHub地址汇总
  8. “通信大数据”征文通知
  9. 在博客中插入emoji表情
  10. 【方案分享】抖音平台新媒体百问百答:平台规则、爆款涨粉、运营技巧、内容变现.pdf(附下载链接)...
  11. linux RPM包安装、更新、删除等操作命令简明总结, 如何查看yum安装的软件路径 ?...
  12. 在Eclipse中打jar包
  13. 微信小程序——风水罗盘
  14. C语言编写游戏的程序教程,用C语言写贪吃蛇游戏图文教程
  15. 谈刺蛇c语言程序,C语言程设计实验内容与答案.doc
  16. 彻底关闭Chrome浏览器自动更新
  17. 使用C2Prog烧写程序
  18. 文字生成图片的软件有哪些?这篇文章给你介绍三个
  19. 计算机毕设Python+Vue音乐鉴赏网站前端开发(程序+LW+部署)
  20. 从iOS 11看怎样设计APP图标

热门文章

  1. 绝对不能错过!2009~2019 高中数学联赛11年真题解析
  2. 如何逼疯一名数学系学生?
  3. 从基础概念到数学公式,这是一份520页的机器学习笔记(图文并茂)
  4. matlab浮点数求绝对值_MATLAB仿真阵列天线切比雪夫综合法(附代码)
  5. python 内存数据库下载,Python 文件存储和数据库
  6. qt客户端连接服务器不响应,qt判断tcp客户端是否连接服务器
  7. css-6 df15,webpack 样式文件的代码分割(15)
  8. 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地
  9. 第jiu届蓝桥杯单片机省赛真题_第九届蓝桥杯单片机组省赛试题.pdf
  10. java 堆栈_Java中线程与堆栈的关系