1.12 CW 模拟赛 赛时记录

news/2025/1/12 12:42:02/文章来源:https://www.cnblogs.com/YzaCsp/p/18666877

看题

不是哥们怎么感觉一堆原题但是都不会做
没复习最悲惨的一次

策略肯定还是暴力, 没有什么看上去简单的题

\(\rm{T1}\)

思路

侥幸心理找了一下没有啊, 必须自己想

合法串显然就是满足匹配的串
考虑这种经典问题的常见转化 : 令 (\(1\) , )\(-1\) , 合法括号串仅当其任意前缀 \(\geq 0\) 且全串之和 \(= 0\)

先考虑确定 \(i\) 时怎么计算
首先计算 \(T [i : n]\) 中的前缀, 记录所有串和 \(\leq 0\) 的, \(> 0\) 的必定没有作用
然后考虑 \(T [1 : i]\) 中的后缀, 记录所有串和 \(\geq 0\) 的, \(< 0\) 的必定没有作用
有点感性, 但是应该是这样的

考虑答案合并
\(f_i\) 表示对于 \(T [i : n]\) 中的前缀, 所有串和 \(= -i\) 串串的个数, 令 \(g_i\) 表示对于 \(T [1 : i - 1]\) 中的后缀, 所有串和 \(= i\) 的串串的个数
容易发现 \(g_i, f_i\) 可以组成一个合法串
考虑方案数即为 \(f_i \times g_i\)

感觉就是这样, 手摸下样例

发现一些问题, \(f_i\) 还要新开一维表示串和, 但是显然是做不到的
\(f_{i, j}\) 表示对于所有以 \(i\) 开头的串串, 所有串和 \(= -j\) 串串的个数, 令 \(g_{i, j}\) 表示对于所有以 \(i\) 结尾的串串, 所有串和 \(= j\) 的串串的个数, 考虑怎么做到对于每一个 \(i\) , 快速算出 \(f, g\)

好消息是 \(\mathcal{O} (n^2)\) 能做了

考虑的更深一点, 其实可以对于全串的前后缀做处理进而找到 \(f, g\)
问题变成怎么做才能规避掉对前后缀串和的枚举


理一下

首先是一个基础:
对于 \(i\) 位置结果的统计, 你只需要考虑

  • \(i\) 结尾的后缀中, 串和 \(\geq 0\)
  • \(i\) 开头的前缀中, 串和 \(\leq 0\)

误区在于你还是要统计不满足考虑条件的作为转移, 不然会漏掉情况

那么具体的, 我们设计状态
\(f_{i, j}\) 表示以 \(i\) 结尾的后缀中, 串和为 \(j\)
\(g_{i, j}\) 表示以 \(i\) 开头的前缀中, 串和为 \(j\)

\(f, g\) 的状态转移是容易做到 \(\mathcal{O} (n)\) 的, 考虑 \(i\) 点的答案
容易做到分类讨论

  • 前缀 + \(i\) + 后缀
  • 前缀 + \(i\)
  • \(i\) + 后缀

非常经典的分类, 以后一定要注意不要漏了


但是你发现瓶颈在枚举 \(j\) 上, 怎么办, 必须解决这个问题

这个可能要改一下状态, 或者整体处理
不太会了

实现 \(30 \rm{pts}\)

框架

如上讨论即可

代码

#include <bits/stdc++.h>
#define int long long
const int MAXN = 5206; //41
const int MOD = 1e9 + 7;
namespace calc {int add(int a, int b) { return a + b > MOD ? a + b - MOD : a + b; }int sub(int a, int b) { return a - b < 0 ? a - b + MOD : a - b; }int mul(int a, int b) { return (a * b * 1ll) % MOD; }void addon(int &a, int b) { a = add(a, b); }
} using namespace calc;int n;
std::string bra;
int a[MAXN];
std::map<int, int> f[MAXN], g[MAXN];signed main()
{std::cin >> bra; n = bra.length(); bra = ' ' + bra;for (int i = 1; i <= n; i++) a[i] = (bra[i] == '(') ? 1 : -1, f[i][a[i]] = 1, g[i][a[i]] = 1;/*转移*/for (int i = 1; i <= n; i++) for (int j = -n; j <= n; j++) addon(f[i][j], f[i - 1][j - a[i]]);for (int i = n; i >= 1; i--) for (int j = -n; j <= n; j++) addon(g[i][j], g[i + 1][j - a[i]]);int ans = 0;/*统计答案*/for (int i = 1; i <= n; i++) {int res = 0;for (int j = ((a[i] == 1) ? -1 : 1); j <= n; j++) addon(res, mul(f[i - 1][j], g[i + 1][-j - a[i]]));if (a[i] == 1) addon(res, g[i + 1][-a[i]]);if (a[i] == -1) addon(res, f[i - 1][-a[i]]);addon(ans, mul(res, i));}printf("%lld", ans);return 0;
}

\(\rm{T2}\)

\(\rm{T1}\) 想乱了, 先去想 \(\rm{T2}\) , 回头再看 \(\rm{T1}\)
甚至 \(\rm{T2}\) 也像做过的题

很危险, 赶紧把该拿的分拿了, 不要在死磕
先不管 \(\rm{T1}\)

今天的策略是把后面的题暴力打了死磕 \(\rm{T1}\)

思路

这个题绝对是做过的

原来至少三位数是这样的吗

好吧那不管这道题

\(\rm{T3}\)

目前得分: \(130 \ \rm{pts}\)
虽然那 \(100\) 应该不能算

思路

首先把每一行删除一位之后结果相同的删除选择并到一起
具体的, 如果删除 \(a_i, a_j\) 对于 \(i\) 行的结果一样, 那么把 \(i, j\) 加入同一个集合, 假设第 \(i\) 行对应的操作集合为 \(\mathbb{S}_{i, k}\)

考虑 \(\rm{dp}\) , 令 \(f_{i, j}\) 表示考虑到第 \(i\) 行, 其中这一行删除的位置属于 \(j\) 集合的方案数
考虑转移

\[f_{i, j} \gets \sum_{\mathbb{S}_{i - 1, k} \cap \mathbb{S}_{i, j} \neq \varnothing} f_{i - 1, k} \]

其中并集特殊实现
复杂度 \(\mathcal{O} (n^3)\) , 完全足够了, 开打

总结

\(\rm{T1}\) 思路不够优秀, 没有意识到这一点浪费了太多时间
\(\rm{T3}, \rm{T4}\) 部分分很多, 没有意识到这一点

以后一定要对自己的水平有清楚认知, 做好策略, 然后按照时间分配打下去, 切莫死磕

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

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

相关文章

国内云服务器怎么选

前言 作为一名个人开发者,无论是搭建网站、编写小程序,还是运行脚本,我几乎离不开云服务器。回想从大学时期开始接触服务器,到如今进入职场,已累积了近十年的使用经验。从最初的“乞丐版”1核0.5G服务器,到如今的“土豪版”8核16G云服务器,再到云数据库、云Redis、云存储…

如何解决网站模板无法更新及后台操作异常的问题

您好,根据您的描述,您遇到了以下两个主要问题:网站模板无法更新,即使删除旧模板并上传新模板后,仍然显示旧模板。 登录网站后台后,部分系统板块无法点击,且栏目内容混乱。为了解决这些问题,请按照以下步骤进行排查和处理: 一、网站模板无法更新清除浏览器缓存浏览器缓…

如何安全有效地修改网站后台代码而不影响正常运行

问题描述: 用户希望能够安全有效地修改网站后台代码,但又担心会因为不当操作而导致网站无法正常运行。因此,他们寻求一种既能够实现定制化开发又能保证系统稳定性的方法。 回答: 当涉及到网站后台代码的修改时,确保安全性和稳定性是非常重要的。下面是一些实用的建议和最佳…

rust学习十六.3、并发-线程之间共享数据

线程之间共享数据,即go中部分人所憎恶的方式! 然而,这个方式并非没有其优点,否则操作系统也不提供这种实现方式。闲言少序,上正文! 一、概述 * 1.当我们大谈基于信道通信时,应该指的是应用级别。如果是操作系统,应该还是会有多种措施的,否则rust的源头在哪里来着。* 2…

如何使用宝塔面板修改网站缓存

缓存是提高网站加载速度和性能的重要手段。宝塔面板提供了多种缓存管理工具,帮助用户轻松配置和管理网站缓存。以下是具体步骤:步骤 描述登录宝塔面板 使用管理员账号登录到宝塔面板控制台。进入网站设置 在左侧菜单中选择“网站”,然后点击需要修改缓存的域名。打开缓存设置…

如何安全有效地重置Linux服务器的远程登录密码?

忘记Linux服务器的远程登录密码是一个常见的问题。为了确保您的服务器安全并顺利恢复访问权限,请按照以下步骤操作:提交工单请求密码重置:登录到服务商的管理后台,找到“主机租用/vps、云主机”选项。 选择“系统设置”,然后点击“服务器远程/WDCP管理账号密码重置/修改”…

网站存在非法信息,被系统拦截禁止访问

检查网站代码,确保没有被注入恶意代码。 联系程序提供商清理并修复程序漏洞。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD…

域名解析失败的全面排查与解决方案

当您遇到新注册的域名无法解析的问题时,可能是由多个因素引起的。以下是详细的排查步骤和解决方案:确认域名注册成功:登录域名注册商的管理后台,确认域名已经成功注册并处于有效状态。 检查域名的有效期和状态,确保没有过期或被锁定。检查DNS解析设置:确认域名解析记录(…

新注册域名解析生效需要多长时间?

域名解析生效时间实名认证:首先,确保域名已经完成实名认证。这是在中国境内注册域名的必要步骤。 解析记录添加:在域名管理后台添加或修改解析记录后,解析生效的时间取决于多个因素。因素 影响说明运营商DNS 大部分运营商DNS可以在10-30分钟内生效,少数DNS可能需要1-3小时…

如何修改网站SQL中的密码?

修改网站数据库中的密码是一个常见的需求,尤其是在忘记管理员密码或需要增强安全性的情况下。以下是针对不同类型的网站(如WordPress、Joomla、Drupal、织梦等)修改数据库密码的具体步骤和注意事项。 一、通用步骤 1. 登录数据库管理工具使用phpMyAdmin:通过控制面板(如cP…

IDEA自定义注解配置

一、类注释 1、打开设置 打开设置:Settings->Editor->File and Code Templates,如下图。 File Header.java为引用的模板文件类头文件注释模板(File Header.java) /*** @title ${NAME}* @date ${DATE} ${TIME}* @author you-ni* @description TODO*/二、方法注释 1、打…

ASP.NET Core - 日志记录系统(二)

本篇接着上一篇 [ASP.NET Core - 日志记录系统(一)] 往下讲,所以目录不是从 1 开始的。2.4 日志提供程序 2.4.1 内置日志提供程序 ASP.NET Core 包括以下日志记录提供程序作为共享框架的一部分:Console Debug EventSource EventLog除此之外,还有一些微软官方提供的,但是没有…