题解:CF704B Ant Man

news/2024/10/4 22:07:24

从这来的,套路都一样,预设型 DP。

把那个式子拆开,看每个数单独的贡献。

  • 一个数比它左边的数小,它的贡献就是:\(-x_i + b_i\)
  • 比它左边的数大,它的贡献就是:\(x_i + a_i\)
  • 比它右边的数小,它的贡献就是:\(-x_i + d_i\)
  • 比它右边的数大,它的贡献就是:\(x_i + c_i\)

即:

int Gl(int i) { // > 左边return x[i] + a[i];
}
int Gr(int i) { // > 右边return x[i] + c[i];
}
int Ll(int i) { // < 左边return -x[i] + b[i];
}
int Lr(int i) { // < 右边return -x[i] + d[i];
}

\(f_{i,j}\) 表示已经插入 \(i\) 个数,这些数构成了 \(j\) 个连续段。

新插入的数比后插入的数小,所以一个数插进去的时候可以直接根据前后有没有数来计算贡献。

分类讨论即可,我分的情况比较细致,其实有几个情况有重合,但胜在好理解。

如果 \(i=S\)

  • 插入到最左边,形成单独的块:
    • \(f_{i,j} = f_{i-1,j-1}+Lr(i)\)
  • 插入到最左边块的左边。如果 \(E\) 已经插入,并且 \(j=1\),这种情况就不成立了:
    • \(f_{i,j} = f_{i-1,j}+Gr(i)\)

如果 \(i=E\)

  • 插入到最右边,形成单独的块:
    • \(f_{i,j} = f_{i-1,j-1}+Ll(i)\)
  • 插入到最右边块的右边。如果 \(S\) 已经插入,并且 \(j=1\),这种情况不成立:
    • \(f_{i,j} = f_{i-1,j}+Gl(i)\)

接下来看平常的情况:

  • 插入到所有数最左边,构成一个新块。如果 \(S\) 已经插入则不成立:
    • \(f_{i,j} = f_{i-1,j-1}+Ll(i)+Lr(i)\)
  • 插入到最左边块的左边。如果 \(S\) 已经插入则不成立:
    • \(f_{i,j} = f_{i-1,j}+Ll(i)+Gr(i)\)
  • 插入到所有数最右边,构成一个新块。如果 \(E\) 已经插入则不成立:
    • \(f_{i,j} = f_{i-1,j-1}+Ll(i)+Lr(i)\)
  • 插入到最右边块的右边。如果 \(E\) 已经插入则不成立:
    • \(f_{i,j} = f_{i-1,j}+Gl(i)+Lr(i)\)
  • 插到中间某块的左边。注意一定要有中间块,所以要满足 \(j>1\)
    • \(f_{i,j} = f_{i-1,j}+Ll(i)+Gr(i)\)
  • 插到中间某块的右边。注意一定要有中间块,所以要满足 \(j>1\)
    • \(f_{i,j} = f_{i-1,j}+Gl(i)+Lr(i)\)
  • 插到中间单独成块。两边一定要有块,所以要满足 \(j > 2\)
    • \(f_{i,j} = f_{i-1,j-1}+Ll(i)+Lr(i)\)
  • 插到中间链接两个块:
    • \(f_{i,j} = f_{i-1,j+1}+Gl(i)+Gr(i)\)

对于 DP 边界详细见代码。

代码用一些技巧合并了重复的情况。

#include <bits/stdc++.h>using namespace std;#define int long longconst int maxN = 5007;int n, f[maxN][maxN];
int S, T;int x[maxN], a[maxN], b[maxN], c[maxN], d[maxN];
int Gl(int i) {return x[i] + a[i];
}
int Gr(int i) {return x[i] + c[i];
}
int Ll(int i) {return -x[i] + b[i];
}
int Lr(int i) {return -x[i] + d[i];
}int chkmin(int &x, int y) {return x = x > y ? y : x;
}signed main() {cin >> n >> S >> T;for (int i = 1; i <= n; i++) cin >> x[i];for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i <= n; i++) cin >> b[i];for (int i = 1; i <= n; i++) cin >> c[i];for (int i = 1; i <= n; i++) cin >> d[i];memset(f, 0x3f, sizeof(f));if (S == 1)f[1][1] = Lr(1);else if (T == 1)f[1][1] = Ll(1);elsef[1][1] = Ll(1) + Lr(1);for (int i = 2; i < n; i++) {for (int j = 1; j <= i; j++) {if (i == S || i == T) {if (i == S) {chkmin(f[i][j], f[i - 1][j - 1] + Lr(i));if (j > (i > T))chkmin(f[i][j], f[i - 1][j] + Gr(i));}else {chkmin(f[i][j], f[i - 1][j - 1] + Ll(i));if (j > (i > S))chkmin(f[i][j], f[i - 1][j] + Gl(i));}continue;}if (i > S && i > T && j == 1) continue;if (j > (i > T) + (i > S))chkmin(f[i][j], f[i - 1][j - 1] + Ll(i) + Lr(i));chkmin(f[i][j], f[i - 1][j + 1] + Gl(i) + Gr(i));if (i < S || j != 1)chkmin(f[i][j], f[i - 1][j] + Ll(i) + Gr(i));if (i < T || j != 1)chkmin(f[i][j], f[i - 1][j] + Gl(i) + Lr(i));}}if (T == n)f[n][1] = f[n - 1][1] + Gl(n);else if (S == n)f[n][1] = f[n - 1][1] + Gr(n);elsef[n][1] = f[n - 1][2] + Gl(n) + Gr(n);cout << f[n][1] << '\n';
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67805.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

vs2015安装包丢失或损坏解决工具 或者不能启动

打开“本地组策略编辑器”(gpedit.msc)。展开“计算机配置”>“管理模板”>“系统”>“Internet 通信管理”,然后选择“Internet 通信设置”。选择“关闭自动根证书更新”>,“禁用”,然后选择“确定”或“应用”。  下载最新的组件版本(备份的) https://lea…

uboot 启动自编写程序的方式

uboot 启动自编写程序的方式 uboot 存在 boot 命令。 自己最初在尝试撰写串口程序时,选择了使用汇编来完成。 在这段时间,自己使用 go 命令来尝试载入程序 先是在 Ubuntu 上搭建 tftp 目录 # /etc/default/tftpd-hpaTFTP_USERNAME="tftp" TFTP_DIRECTORY="/ho…

20240924

[牛半仙的妹子 Tree(tree)](http://ac.robo-maker.cn/d/contest/p/ZY1044?tid=66f28cd11bca2159e88c8fb0) 我们会发现其实牛半仙发癫时就等于将以前的标记清空,从头开始,所以我们可以考虑根号分治,如果两个牛半仙发癫的时间间隔小于 \(\sqrt n\) ,那么我们可以直接暴力枚举两…

『模拟赛』冲刺CSP联训模拟2

『模拟赛记录』冲刺CSP联训模拟2Rank 不重要了A. 挤压 你说的对,期望怎么能算签呢? 一个重要的性质:一个数的平方可以在二进制下表示为 \(\sum_{i,j}\ s_i\ s_j\ 2^{i+j}\),所以就可以分别求每一位对答案的贡献了。 设 \(f_{i,1/0,1/0}\) 表示到第 \(i\) 个数我们枚举的两位…

PbootCms上传图片变模糊、上传图片尺寸受限的解决方案

在使用PbootCMS的过程中,如果上传的图片被压缩变得模糊,通常是因为上传的图片尺寸过大。PbootCMS 默认的上传图片限制宽度为 1920 像素,缩略图的限制大小为 10001000 像素。可以通过调整这些参数来解决这个问题。 解决方案打开 config.php 文件 调整 max_width 和 max_heigh…

ROS基础入门——实操教程

ROS新人可看ROS基础入门——实操教程前言 本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记。Ruby Rose,放在这里相当合理前言:本文初编辑于2024年10月24日 CSDN主页:https://blog.csdn.net/rvdgds…

PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展

在PbootCMS中增加可允许上传的文件类型(例如 webp、mov 等文件格式),需要在多个地方进行配置。以下是详细的步骤: 操作步骤 1. 修改 config.php 文件 首先需要修改 config.php 文件,增加允许上传的文件类型。打开 config.php 文件打开 config.php 文件,通常位于 /config …

出现“登录失败,表单提交校验失败”,请检查服务器环境

如果出现“登录失败,表单提交校验失败”,请检查服务器环境,然后刷新页面重试,或者删除 runtime 文件夹,然后刷新页面重试。 操作步骤删除 runtime 文件夹使用 FTP 客户端或 SSH 连接到服务器。 删除 runtime 文件夹:bashcd /path/to/your/site rm -rf runtime刷新页面清除…