CSP-S 37

news/2025/10/24 18:15:45/文章来源:https://www.cnblogs.com/HS-fu3/p/19164004

10.24

连续inf场没有切掉 t1 了\(\ldots\)

0+100+70+30=200

甚至 t1 是唯一爆蛋的。

2h 写 t1 获得 0pts 好成绩,剩下 2h 获得 200pts 。

难崩。

t1

第一眼:好像那道\(O(n^3)\) dp 。

第二眼:坏了回文串咋转移?

结果就是 2h 打了坨大的。

正解为四维dp,时间复杂度\(O(n^4)\)

首先要发现性质:

一定是 \(a\) , \(b\) 两串中连续的两部分穿插拼接更优。

考虑若不连续,则显然可以将其扔到最前(后)面,找到更优(起码不劣)解。

于是就有了四维可行性dp。

\(dp_{i,j,l,r}\) 表示 \(a\)\(i\)\(j\)\(b\)\(l\)\(r\) 能否拼成回文串(0/1)。

枚举 \(i,j,l,r\) 即可(或改为枚举长度)。

转移是朴素的,若 \(a\) 串向左右扩展可行则转移,剩下三种情况同理。

注意初始化一定要到位(奇偶回文,上界问题)。

详见code

代码
#include <bits/stdc++.h>
using namespace std;
int T;
char s[55], t[55];
bool dp[60][60][60][60]; // 0/1 表示能否构成回文signed main()
{freopen("string.in", "r", stdin);freopen("string.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> T;while (T--){cin >> (s + 1) >> (t + 1);int len1 = strlen(s + 1), len2 = strlen(t + 1);s[0] = '%', t[0] = '&', s[len1 + 1] = '#', t[len2 + 1] = '$';memset(dp, 0, sizeof(dp));int ans = 1;// 初始化for (int i = 1; i <= len1; ++i)for (int j = 1; j <= len2 + 1; ++j)dp[i][i][j][j - 1] = 1;for (int i = 1; i <= len2; ++i)for (int j = 1; j <= len1 + 1; ++j)dp[j][j - 1][i][i] = 1;for (int i = 1; i <= len1; ++i)for (int j = 1; j <= len2; ++j){if (s[i] == t[j])dp[i][i][j][j] = 1;ans = 2;}for (int i = 1; i < len1; ++i)if (s[i] == s[i + 1]){for (int j = 1; j <= len2 + 1; ++j)dp[i][i + 1][j][j - 1] = 1;ans = 2;}for (int i = 1; i < len2; ++i)if (t[i] == t[i + 1]){for (int j = 1; j <= len1 + 1; ++j)dp[j][j - 1][i][i + 1] = 1;ans = 2;}// 可行性dpfor (int la = 0; la <= len1; ++la){for (int i = 1; i <= len1 - la + 1; ++i){int j = i + la - 1;for (int lb = 0; lb <= len2; ++lb){for (int p = 1; p <= len2 - lb + 1; ++p){int q = p + lb - 1;if (dp[i][j][p][q]){ans = max(ans, la + lb);if (i > 1 && j < len1 && s[i - 1] == s[j + 1])dp[i - 1][j + 1][p][q] = 1;if (i > 1 && q < len2 && s[i - 1] == t[q + 1])dp[i - 1][j][p][q + 1] = 1;if (p > 1 && j < len1 && t[p - 1] == s[j + 1])dp[i][j + 1][p - 1][q] = 1;if (p > 1 && q < len2 && t[p - 1] == t[q + 1])dp[i][j][p - 1][q + 1] = 1;}}}}}cout << ans << "\n";}return 0;
}

t2

我去怎么是计数,完了要爆了wwwww

诶?这个好像简单。

切了。

第一道独立完成的计数题。

这题真的简单于 t1 吧?

容易发现,对于每个 \(i\) ,方案数只与 \(i-1\) 在每一位置上的出现次数有关,维护这个就行。

具体的,设共 \(n\) 个数,若 \(a_{i-1}=1\),答案为:

\(\sum\limits_{i=1}^{n-1}f_i\times(i-j)\)

其中\(f_i\) 本为 \(f_{i,j}\) 表示数 \(i\) 在位置 \(j\) 上出现的次数,由于每次转移只与 \(f_{i-1,j}\) 有关,所以滚掉第一维。

对于 \(a_{i-1}=0\) 的情况类似,请自行推导。

\(f\) 的转移为一段前缀(或后缀)的累加(0/1情况不同),前缀和优化即可。

最终时间复杂度\(O(n^2)\)

这道思路,转移和优化都不难,多模数据就出了。

所以为啥这道不是 t1 ?

code

哒哒
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2010;
const int mod = 1e9 + 7;
int n, ans;
int a[N], f[N], g[N];signed main()
{freopen("perm.in", "r", stdin);freopen("perm.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> n;for (int i = 1; i < n; ++i)cin >> a[i];f[1] = 1;for (int i = 2; i <= n; ++i){ans = 0;if (a[i - 1]) // 1 i < i+1{for (int j = 1; j < i; ++j){(ans += f[j] * (i - j) % mod) %= mod;g[j + 1] = f[j];}for (int j = 1; j <= i; ++j)g[j] = (g[j - 1] + g[j]) % mod;}else // 0 i > i+1{for (int j = i; j; --j){(ans += f[j] * j % mod) %= mod;g[j] = f[j];}for (int j = i - 1; j; --j)g[j] = (g[j + 1] + g[j]) % mod;}memcpy(f, g, sizeof(g));memset(g, 0, sizeof(g));}cout << ans << "\n";return 0;
}// 272// 938843096

t3

暴力魅力时刻。

我去暴力竟然有70pts!

暴力了。

正解:

发现每次点数不会超过 \(\log_2n\)

对于小于 400 的部分直接dp即可。

\(100000/(2^8)\approx 400\)

大于400的部分暴搜,之后拼接答案即可。

其实就是根号分治(应该是吧,反正大体一致)。

code:

暴力!暴力!暴力!
#include <bits/stdc++.h>
#define pir pair<int, int>
#define fi first  // val
#define se second // weight
using namespace std;
const int N = 1e5 + 10;
int n, q;
pir a[N], d[N];
int num[20], tot, dp[401][N];
int cnt;inline void dfs(int id, int sum, int lim, int up)
{if (lim > up)return;if (id > tot){d[++cnt] = {sum, lim};return;}dfs(id + 1, sum + a[num[id]].fi, lim + a[num[id]].se, up);dfs(id + 1, sum, lim, up);
}signed main()
{freopen("knapsack.in", "r", stdin);freopen("knapsack.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cin >> n;for (int i = 1; i <= n; ++i)cin >> a[i].fi >> a[i].se;for (int i = 1; i <= 400; ++i){memcpy(dp[i], dp[i >> 1], sizeof(dp[i]));for (int j = 100000; j >= a[i].se; --j)dp[i][j] = max(dp[i][j], dp[i][j - a[i].se] + a[i].fi);}cin >> q;int x, up;while (q--){cin >> x >> up;if (x <= 400){cout << dp[x][up] << "\n";continue;}tot = 0, cnt = 0;while (x > 400){num[++tot] = x;x >>= 1;}int ans = 0;dfs(1, 0, 0, up);for (int i = 1; i <= cnt; ++i)ans = max(ans, d[i].fi + dp[x][up - d[i].se]);cout << ans << "\n";}return 0;
}

t4

咕咕咕

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

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

相关文章

SpringBoot整合缓存1-Ehcache

一、缓存是什么? 缓存是一种将数据临时存储在高速存储介质(如内存)中的技术,目的是减少对数据库等低速存储的访问,提升系统响应速度。 Ehcache 是一个成熟的 Java 缓存框架,支持本地缓存和分布式缓存(需配合 Te…

【开题答辩全过程】以 M11289生鲜商城为例,具备答辩的问题和答案

【开题答辩全过程】以 M11289生鲜商城为例,具备答辩的问题和答案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

如何在一台 Linux 机器上管理不同版本的 CMake

目录🧩 为什么需要多版本 CMake?✅ 核心原则📦 步骤 1:下载并安装多个 CMake 版本(推荐预编译包)1.1 创建安装目录1.2 下载预编译二进制包1.3 复制到目标目录🔗 方法一:使用 update-alternatives 管理(推荐…

90 天打造可持续交付:12 条 DevOps 实践要点与避坑

DevOps 不是工具堆砌,而是“从需求到价值”的系统工程。本文用可量化指标(DORA)作为牵引,给出12 项关键实践与90 天落地路线图,并示例如何用 ONES 研发管理平台把需求、任务、测试、发布与复盘串成一条可追踪的价…

CSharp: word,excel,powerpoint convert to pdf,hrml etc using Aspose.Office

/// <summary>/// 目标文件类型/// Aspose是商业软件需要购买/// </summary>public enum FileFormat{None,Pdf,Html,Text,Doc,Docx,Xls,Xlsx,CSV,PPT,PPTx,SVG,Webp,Rtf,Dwg,Psd}/// <summary>/// 文…

Offsec Nibbles CTF 实战解析:PostgreSQL漏洞利用与权限提升

本文详细记录了Offsec Nibbles CTF挑战的完整解题过程,重点分析了PostgreSQL CVE-2022-1552漏洞的利用方法,通过Python脚本实现远程代码执行,并分享了权限提升的实战经验,最后讨论了系统加固建议。Offsec Nibbles …

Linux基础——iptables常规操作

Linux基础——iptables常规操作一、iptables概述iptables 的核心是四表五链,四表:raw, connecting tracking, mangle, nat 五链:PREOUTING, INPUT, FORWAED, OUTPUT, POSTROUTING 每种表可以包含的链种类TablesPRER…

MySQLdump 常用参数说明 - 实践

MySQLdump 常用参数说明 - 实践2025-10-24 18:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

2025 10 24日报

上午 写了周作业的F题,一开始以为很难,后面发现字符串的长度小于等于100,于是就可以直接设 dp[i,j,k], 表示 [1∼i] 里面有 j 个 1,总贡献为 k 的方案中与 s [1∼i] 最小的不同个数,然后转移就很明显了dp[i,j,k]…

Linux手动安装最新版 CMake

目录🔽 步骤 1:进入临时目录并下载 CMake 二进制包🔧 步骤 2:解压安装包🧩 步骤 3:将 CMake 添加到系统 PATH方法 A:全局生效(需 root 权限)方法 B:仅对当前用户生效(无 root 权限也可用)✅ 步骤 4:验…

2025年新疆喀纳斯旅游服务权威推荐榜单:新疆/阿勒泰/禾木深度游旅行社综合评测

碧蓝的喀纳斯湖倒映着雪山林海,三湾的晨雾缭绕如仙境,图瓦村落的木屋错落于林间,这片北疆雪域明珠正吸引着越来越多游客的目光。 据新疆文旅厅数据显示,2024年新疆接待游客总量突破2.5亿人次,但随之而来的是投诉量…

一天一款实用的AI工具,第9期,AI转黏土风格

一键将图片转成黏土风格,呈现立体质感与柔和色彩的可爱画面。工具介绍 本期推荐这款【AI转黏土风格】工具,它能将任何照片瞬间变成软萌圆润的黏土动画风! 它完美模拟了真实黏土的柔和质感与磨砂纹理,让人物如同定制…

题解:P8930 「TERRA-OI R1」神,不惧死亡

$O(m \sqrt[3]{\frac{n^2}{m}log^2{n}})$P8930 「TERRA-OI R1」神,不惧死亡 大水紫 首先发现是神秘区间问题,考虑支持区间操作的数据结构。 发现数据范围是 \(1e5\) ,而且维护的东西很神秘,直接考虑分块或莫队。 如…

生产环节最容易出问题的三个点,老板必须盯紧

之前我们企业在做大之前,生产靠的是人盯人。订单少的时候还能勉强跑得动,一旦订单量起来,问题就暴露出来了:计划排不准,执行乱套,质量失控。 在企业规模升级的那几年,我学到了很多,总结起来,生产环节最容易出…

CS50ai: week2 Uncertainty我的笔记A版 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 OSCAR丨与创新者同频!Apache RocketMQ 邀您共赴开源之约

10 月 28 日,北京将迎来开源行业的一场重磅盛会——2025 OSCAR 开源产业大会。 本次大会汇聚全球开源领域的思想领袖、技术专家、企业高管以及创新实践者,围绕开源技术的未来、产业创新及生态协同展开深度讨论。 大会…

2025年PSA制氮设备厂家权威推荐榜单:电解水制氢设备/氦气纯化系统/氘气回收纯化源头厂家精选

在现代工业生产中,氮气作为重要的保护性气体,广泛应用于电子、化工、食品、医药等多个领域。PSA(Pressure Swing Adsorption,变压吸附)制氮设备因其高效节能、操作简便的特点,已成为工业气体分离技术中的重要一环…

解决git clone只有master分支的问题

解决git clone只有master分支的问题clone code: git clone git@gitlab.xxx.yy:zzz/IPM_Semantic.git 在使用 git clone + 远程仓库地址将项目下载下来之后,倘若远程仓库有多个分支,会发现,使用git branch查看本地分…

一文读懂循环神经网络(RNN):原理、局限与LSTM解决方案 - 指南

一文读懂循环神经网络(RNN):原理、局限与LSTM解决方案 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

2025年搬家纸箱权威推荐榜单:物流包装/电商纸箱/平口纸箱源头厂家精选

在物流搬运、家庭搬迁及电商包装领域,纸箱作为不可或缺的包装材料,其质量直接关系到物品的安全与搬运效率。面对市场上琳琅满目的纸箱产品,选择一家可靠的供应商成为许多企业与个人消费者的关键任务。本文基于实地考…