CSP-S 模拟赛34

news/2024/12/21 20:46:01/文章来源:https://www.cnblogs.com/Rock-N-Roll/p/18447336

CSP-S 模拟赛34

T1

考虑对原序列将 \(k\) 的左右分成两个序列。simple 的想法是分别从 \(1\) 开始跑前缀和,每一次总跑到下一个小于它的点,然后依次类推。发现这样做碰到序列最小值之后难以继续。

然而我们发现这样跑点的过程从前往后和从后往前是等价的。这样考虑的原因是发现这样的选数问题不具有方向性。于是时间复杂度 \(O(n)\)

代码:

#include <bits/stdc++.h>
#define N 100005
#define int long long
using namespace std;
int T;
int n, k;
int a[N];
int a1[N], a2[N];
int ct1, ct2;
int sm1[N], sm2[N];
int nx1[N], nx2[N];
void sve() {memset(sm1, 0, sizeof sm1);memset(sm2, 0, sizeof sm2);memset(nx1, 0, sizeof nx1);memset(nx2, 0, sizeof nx2);cin >> n >> k;for (int i = 1; i <= n; i++)scanf("%lld", &a[i]);ct1 = ct2 = 1;a1[1] = a2[1] = 0;for (int i = k; i > 1; i--)a1[++ct1] = a[i];for (int i = k + 1; i <= n; i++)a2[++ct2] = a[i];for (int i = 1; i <= ct1; i++)sm1[i] = sm1[i - 1] + a1[i];for (int i = 1; i <= ct2; i++)sm2[i] = sm2[i - 1] + a2[i];int mn = sm1[1], nw = 1;for (int i = 2; i <= ct1; i++)if (sm1[i] <= mn) {nx1[nw] = i;nw = i;mn = sm1[i];}mn = sm1[ct1], nw = ct1;for (int i = ct1 - 1; i >= 1; i--)if (sm1[i] < mn) {nx1[nw] = i;nw = i;mn = sm1[i];}mn = sm2[1], nw = 1;for (int i = 2; i <= ct2; i++)if (sm2[i] <= mn) {nx2[nw] = i;nw = i;mn = sm2[i];}mn = sm2[ct2], nw = ct2;for (int i = ct2 - 1; i >= 1; i--)if (sm2[i] < mn) {nx2[nw] = i;nw = i;mn = sm2[i];}if (sm1[ct1] + sm2[ct2] > 0)return puts("No"), void();int p1 = 1, p2 = 1;while (nx1[p1] || nx2[p2]) {if (!nx1[p1]) {for (int j = p2 + 1; j <= nx2[p2]; j++)if (sm1[p1] + sm2[j] > 0) {puts("No");return;}p2 = nx2[p2];continue;}if (!nx2[p2]) {for (int j = p1 + 1; j <= nx1[p1]; j++)if (sm1[j] + sm2[p2] > 0) {puts("No");return;}p1 = nx2[p1];continue;}int fg = 0;for (int i = p1 + 1; i <= nx1[p1]; i++)if (sm1[i] + sm2[p2] > 0) {fg = 1;break;}if (!fg) {p1 = nx1[p1];continue;}for (int j = p2 + 1; j <= nx2[p2]; j++)if (sm1[p1] + sm2[j] > 0) {puts("No");return;}p2 = nx2[p2];}p1 = ct1, p2 = ct2;while (nx1[p1] || nx2[p2]) {if (!nx1[p1]) {for (int j = p2 - 1; j >= nx2[p2]; j--)if (sm1[p1] + sm2[j] > 0) {puts("No");return;}p2 = nx2[p2];continue;			}if (!nx2[p2]) {for (int j = p1 - 1; j >= nx1[p1]; j--)if (sm1[j] + sm2[p2] > 0) {puts("No");return;}p1 = nx2[p1];continue;			}int fg = 0;for (int i = p1 - 1; i >= nx1[p1]; i--)if (sm1[i] + sm2[p2] > 0) {fg = 1;break;}if (!fg) {p1 = nx1[p1];continue;}for (int j = p2 - 1; j >= nx2[p2]; j--)if (sm1[p1] + sm2[j] > 0) {puts("No");return;}p2 = nx2[p2];}puts("Yes");
}signed main() {freopen("game.in", "r", stdin);freopen("game.out", "w", stdout);cin >> T;for (int i = 1; i <= T; i++)sve();return 0;
}

T2

显然考虑 \(O(n^2)\) 的 dp。

朴素的 dp 定义是 \(dp_{i,j}\) 表示长度为 \(i\) 的序列,\(j\) 次消除的方案数。然而发现这样转移的复杂度难以接受,需要分别枚举左右区间的消除次数。

考虑某一个位置 \(x\) 的消除次数由什么决定。对于只有某一边有 \(>a_x\) 的,则这个位置的消除次数一定是 \(j-1\)。对于两边都有 \(>a_x\) 的,两边的消除次数有一个是 \(j-1\)。那么就考虑前缀和优化这个 dp,则定义 \(dp_{i,j,0/1}\) 表示长度为 \(i\) 的序列,至多 \(j\) 次消除,有一边 / 两边 \(>a_x\) 的方案数,那么 \(j\) 便由 \(j,j-1\) 转移而来。

时间复杂度大抵是 \(O(n^2\log^2n)\)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.Java集合框架_List接口

集合与数组的区别数组:长度开始时必须指定,而且一旦指定,不能修改。 保存的必须为同一类型的元素。 使用数组进行增加/删除元素比较麻烦。集合:可以动态保存任意多个对象,使用比较方便。 提供了一系列方便操作对象的方法: add、remove、set、get。 使用集合添加,删除新元…

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刷新页面清除…

多次密码错误导致登录界面锁定,可以删除网站的 runtime 文件夹

如果多次密码错误导致登录界面锁定,可以删除网站的 runtime 文件夹,然后刷新页面重试。 操作步骤删除 runtime 文件夹使用 FTP 客户端或 SSH 连接到服务器。 删除 runtime 文件夹:bashcd /path/to/your/site rm -rf runtime刷新页面清除浏览器缓存。 重新访问后台登录页面扫…

红日靶机(三)笔记

VulnStack-红日靶机三 概述 相交于前边两个靶场环境,靶场三的难度还是稍难一点,有很多兔子洞,这就考验我们对已有信息的取舍和试错,以及对渗透测试优先级的判断。涉及到对数据库操作的试错,对 joomla 框架 cve 的快速学习,php 中 用到disabled_function 的 bypass ,对li…

快乐数学2勾股定理0000000

2 勾股定理 在任意一个直角三角形中,两条直角边的平方和等于斜边的平方。 a + b = ca 和 b 分别表示直角三角形的两条直角边长度。 c 表示斜边长度。我们大多数人都认为这个公式只适用于三角形和几何图形。勾股定理可用于任何形状,也可用于任何将数字平方的公式。 2.1 了解面…

信息学奥赛复赛复习11-CSP-J2020-04方格取数-动态规划、斐波那契数列、最优子结构、重叠子问题、无后效性

PDF文档公众号回复关键字:202410041 P7074 [CSP-J2020] 方格取数 [题目描述] 设有 nm 的方格图,每个方格中都有一个整数。现有一只小熊,想从图的左上角走到右下角,每一步只能向上、向下或向右走一格,并且不能重复经过已经走过的方格,也不能走出边界。小熊会取走所有经过的…

python相平面 图形

二阶非线性自治系统绘制相平面图。假设我们有一个简单的阻尼摆系统,其状态方程可以表示为: \[ dx1/dt = x2 \\dx2/dt = -cx2 - gsin(x1) \] import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint # 定义系统的状态方程 def pendu…