2025-10-28 aoao Round 比赛总结

news/2025/10/28 21:54:39/文章来源:https://www.cnblogs.com/-jz8-/p/-/251028

比赛链接

比赛时的状态 be like:

  • 我靠,这题怎么这么难?T1 就开始上难度了?
  • 没一道题会写,不会要爆零然后遗憾离场了吧?
  • (想了 2147483647 种 T1 的假做法)
  • (去体检,在测血压时)等会,我好像想明白 T1 的本质了……
  • (回机房)秒切 T1!
  • 开 T2!也不难,想一想就会了!
  • 看来这场比赛也就那样嘛!向着 T3 进发!
  • 不是哥们这是什么东西啊……
  • 6 点,遗憾离场。

可以说是大起大落了。不过还好,最后拿到了最近久违的两个 AC。

T1

可以想到,假如一个子串(可以为空)两边的字符相同,那么翻转这个子串,或者翻转带上两边字符的子串,得到的字符串完全相同。

进一步思考,加入我们有一个字符串形如 a#*&a~-^aa 中间的是任意的字符),那么 a#*&aa-^aa#*&a~-^a 就会被重复计算。归纳可得,设字符串中某个字符出现了 \(n\) 次,那么重复计算的次数就是 \(\frac{(1 + n) n}{2}\) ——对于每个字母都是同理的。

所以,我们统计每个字母的出现次数(别忘了英文字母有 \(26\) 个啊喂——不然小心 10 pts),然后设字符串长度为 \(l\),那么最终答案就是 \(\frac{(1+n)n}{2} + \sum_{i = 1}^{26}\frac{(1+n_i)n_i}{2}\)

#include <bits/stdc++.h>
#define int long long
typedef long long ll;
const int N = 1e5+10;
ll ans;
std::string str;
int times[30];signed main() {freopen("spring.in", "r", stdin);freopen("spring.out", "w", stdout);std::cin >> str;int n = str.size();str = " " + str;for (int i = 1; i <= n; i++) {times[str[i] - 'a' + 1]++;}ans = (1 + n) * n / 2;for (int i = 1; i <= 26; i++) {ans -= (1 + times[i]) * times[i] / 2;}std::cout << ans + 1 << '\n';return 0;
}

T2

首先,如果 \(a_1\) 被修改,那么就无可救药了,因为根据规则,显然 \(a_1\) 必须为 \(0\)。此外,如果 \(a_i\) 被修改,那么下标为 \(i\) 的因数和倍数的地方要受牵连。进一步分析可得,\(i\) 的最大的质因数的所有倍数都要被修改(\(i\) 本身除外)。可以用试除法对 \(i\) 分解质因数,时间复杂度 \(O(\sqrt{n})\)

#include <bits/stdc++.h>
typedef long long ll;
const int N = 1e5+10;
int n, q;int getMaxFactor(int x) {int ans = 0;for (int i = 2; i <= std::sqrt(x); i++) {while (x % i == 0) {ans = std::max(ans, i);x /= i;}}if (x > 1) {ans = std::max(ans, x);}return ans;
}signed main() {freopen("summer.in", "r", stdin);freopen("summer.out", "w", stdout);std::cin >> n >> q;  while (q--) {int x;std::cin >> x;if (x == 1) {std::cout << "-1\n";continue;}int maxFactor = getMaxFactor(x);int ans = n / maxFactor - 1;std::cout << ans << '\n';}return 0;
}

T3

这题正解太难了,这里只讨论可以得 50 pts 的反悔贪心做法。(aoao 太强了!)

设处理第 \(i\) 个位置的糖果需要的费用为 \(V_i\),分多、少两种情况讨论:

  1. 若少了,既可以花 \(X\) 费用解决,即 \(V_i = X\),还可以向前面位置为 \(j\) 处要糖果,花费 \(Z|i-j|\) 费用,并且还要把之前的糖的贡献减去,总费用为 \(Z|i-j|-V_j\),所以 \(V_i = \min(X, Z|i-j|-V_j)\)
  2. 若多了,同理,\(V_i = \min(Y, Z|i-j|-V_j)\)

此时时间复杂度是 \(O(n^2)\),但对于拿 50 分显然还不够,考虑优化。

我们可以拆贡献:

\[\begin{align} V_i &= \min(X, Z|i-j|-V_j),\ i > j \\ &= \min(X, iZ - jZ - V_j),\ i > j \\ &= \min[X, iZ + (-jZ - V_j)],\ i > j \end{align} \]

可见,要让 \(V_i\) 最小,我们需要让 \((-jZ - V_j)\) 最小。

可以开两个小根堆,一个存本来少了糖的单位糖的 \((-jZ-V_j)\),可以用来更新现在糖果多了的地方;另一个存本来多了单位糖的 \((-jZ-V_j)\),可以用来更新现在多了糖果的地方。得到处理当前糖果的费用后把 \((-iZ-V_i)\) 存进堆里,供后面的答案更新。

时间复杂度为 \(O(n\log n)\)

以上内容基本贺自洛谷题解。

#include <bits/stdc++.h>
typedef long long ll;
const int N = 5e5+10;
int n, x, y, z, a[N], b[N];
std::priority_queue<ll, std::vector<ll>, std::greater<ll> > more, less;
ll v[N], ans;signed main() {freopen("autumn.in", "r", stdin);freopen("autumn.out", "w", stdout);std::ios::sync_with_stdio(false);std::cin >> n >> x >> y >> z;for (int i = 1; i <= n; i++) {std::cin >> a[i] >> b[i];for (int j = 1; j <= a[i] - b[i]; j++) {v[i] = y;if (!more.empty()) {v[i] = std::min(v[i], i * z + more.top());more.pop();}less.push(-v[i] - i * z);ans += v[i];}for (int j = 1; j <= b[i] - a[i]; j++) {v[i] = x;if (!less.empty()) {v[i] = std::min(v[i], i * z + less.top());less.pop();}more.push(-v[i] - i * z);ans += v[i];}}std::cout << ans << '\n';return 0;
}

总结

这次考试最大的经验就是没有被看似困难的题面打倒,而是沉住心分析问题的本质。如果我上周六能有这样的态度,就肯定不会 T2 空着了。

当然,比较高级的东西还要多学,争取拿更多分!

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

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

相关文章

P11307 [COTS 2016] 建造费 Pristojba 分析

题目概述 这是一个 \(n\) 个点的无向图 \(G\),然后给你 \(m\) 次操作。 给你每个点的点权 \(p_i\),定义一条边 \((i,j)\) 的边权为 \(p_i+p_j\) 每个操作对应 \((x,l,r)\) 保证 \(x\notin [l,r]\)。 然后对于所有的 …

程序员如何打破职业瓶颈?先搬开这3块绊脚石。

程序员的职业路不算长,可不少人早早就遇到了 “天花板”:想提升没方向,想突破没抓手,这就是让人头疼的 “瓶颈期”。是什么让我们陷入这种困境?又该怎么走出来?咱们一点点说清楚。 摆烂心态 在程序员不算长的职业…

文件清理,推荐几款常用软件

文件清理,推荐几款常用软件给大家汇总如下表格,根据自己的情况自行选择: 您的资助是我最大的动力!金额随意,欢迎来赏!付款后有任何问题请给我留言。 如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的…

AI时代的设计师:从工具到“超人”的进化之路

最近刷到几则关于AI和设计领域的新闻,感觉挺有意思的。站酷发布了AI设计Agent,美图CEO吴欣鸿在演讲中提到AI正让设计师变成“超人”,而另一边,Meta的裁员风波又让人对AI行业的就业前景捏把汗。先说说AI工具如何改变…

MyBatis 动态 SQL 实现原理 - Higurashi

总结自(部分调整):MyBatis 3 源码深度解析SqlSource 与 BoundSql 详解 在介绍原理之前,我们首先需要了解 MyBatis 中和 SQL 语句有关的两个组件,即 SqlSource 和 BoundSql。SqlSource:代表 Java 注解或者 XML 文…

bililun

实验任务1 源代码 T.cpp#include "T.h" #include <iostream> #include <string>// 类T实现// static成员数据类外初始化 const std::string T::doc{"a simple class sample"}; const…

《程序员修炼之道:从小工到专家》观后感第二篇

《代码之美——DRY原则与简洁代码的实效哲学》 核心观点:“不要重复自己(DRY)”是编码的黄金法则,冗余代码会直接推高维护成本与bug发生率,而简洁、自解释的代码是系统可维护性的核心保障。 案例分析:某社交平台…

【学习笔记】数据结构全家桶

Data Structure前言 2025.10.28: 一时兴起建了这个,原因是刚刚学了KTT qwq 我如果塞完这个东西应该都大学几年级了吧 没事慢慢弄 正文 线段树 KTT点我展开看代码 #include<bits/stdc++.h> #define rep(i, l, r…

社区

社区报告名称:AR(Active Area Reverse)fin cut工艺参数与表征指标数据分析报告 版本:V1.0 日期:2025-09-05 编制人:李晓睿 审核人:[姓名/部门] 1. 数据收集报告 1.1 数据来源来源:AR(AA Reverse)fin cut工艺…

「Gym 102759I」Query On A Tree 17

题目大意 给定一颗 \(N\) 个节点以 \(1\) 为根的有根树,每次给以 \(u\) 为根的子树每点加 \(1\) 的值或给路径 \(u - v\) 上每点加 \(1\) 的值,每次修改后查询一个点 \(u\) 使得 \(\sum_{v = 1}^N dis(u, v)\) 最小。…

Mybatis使用简述

什么是 MyBatis? MyBatis 是一款优秀的 Java 持久层框架,它通过 XML 或注解的方式将 Java 对象与数据库中的记录进行映射。与传统的 JDBC 相比,MyBatis 极大地简化了数据库操作代码,让开发者能够更专注于业务逻辑而…

重组蛋白表达服务:CHO HEK293细胞系选择与表达优化方案

重组蛋白表达服务:CHO/HEK293细胞系选择与表达优化方案在生命科学研究领域,重组蛋白作为重要的科研试剂,其质量直接影响实验结果的可靠性。选择合适的表达系统并进行表达优化,是获得高质量重组蛋白的关键环节。本文…

C++里的代码命名规范

以下是 C++ 中最主流的几种命名规范: 1. 蛇形命名法 这是 C++ 标准库和许多 C++ 社区(如 Boost)最推荐的风格。小写蛇形命名法:所有字母小写,单词之间用下划线 _ 连接。适用于:变量、函数、命名空间、文件。 示例…

最小二乘问题详解6:梯度下降法

介绍了使用梯度下降法求解非线性最小二乘问题的原理与实现,通过C++和Eigen库对指数模型进行参数拟合,展示了算法流程、雅可比矩阵计算及收敛行为,并对比了其在机器学习与计算机视觉中的应用差异。1. 引言 在之前的两…

JavaWeb01

1.JavaWeb介绍 什么是JavaWeb?Web:全球广域网,也称万维网(www),能够通过浏览器访问的网站 JavaWeb:使用Java技术来解决相关web互联网领域的技术栈网页:展现数据 数据库:存储和管理数据 JavaWeb程序:逻辑处理数…

现代C++编程初体验

##实验任务1 ##代码#pragma once#include <string>// 类T: 声明 class T { // 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T &t); // 复制构造函数T(T &&t); …

Delphi 利用接口实现frame窗体间的通讯(互动)

需求说明: 程序设计:效果演示:设计思路: FrmCK 只负责发布事件,不关心谁在监听. FrmGrid 只负责响应事件,不关心事件来源. 创建过程: 一.创建接口单元FrmInterface. 全部代码如下:unit FrmInterface;interfaceusessy…

Python冒泡排序:简单易懂的算法实现

在编程的世界里,排序算法是数据处理的基础之一。冒泡排序(Bubble Sort)是一种简单且直观的排序算法,虽然它的效率不是最高的,但它非常适合初学者学习排序算法的基本概念。今天,我们就来详细探讨如何在Python中实…

SAM+ARM

一、首先是图像caption的生成。 输入的图像,被输入进BLIP的图像编码器得到图像嵌入,图像嵌入再经过(BLIP Image-grounded Text Decoder) 得到图像caption。ti表示caption的第i个单词,总共有L个单词。 但是,capti…