当前位置: 首页 > news >正文

【模拟赛总结】20260714 模拟赛总结

P9186 [USACO23OPEN] Milk Sum S

题目大意:给定一个包含 \(n\) 个整数的序列 \(a\),再给定 \(m\)互相独立的操作,每次操作将修改一个元素。之后需要求出一个排列 \(p\),使得 \(T=1\times a_{p_1}+2\times a_{p_2}+\cdots+n\times a_{p_n}\) 最大,针对每次操作求出序列修改后 \(T\) 最大值。

容易得到每次只要从小到大排序就是最优解法了(看样例就可以看出来),因此重点分析放在如何计算贡献。

首先复制一个数组 \(w=a\),接着将序列 \(a\) 从小到大排序,然后计算两个前缀和:

\[pre_i=a_i+pre_{i-1}\\ sup_i=a_i\times i+sup_{i-1} \]

对于每次操作给定的两个数 \(i,x\),我们找到 \(w_i\) 在序列 \(a\) 中的下标与序列 \(a\) 中第一个大于 \(x\) 的数的下标(若不存在则为 \(n-1\)),分别表示为 \(pi\)\(pw\)

  • 如果 \(pw-1\ge pi\):这里的 \(pw-1\) 就是新排序后 \(x\) 在序列 \(a\) 的下标,那么答案就为 \((sup_n-sup_{pw-1}+sup_{pi-1})+(sup_{pw-1}-sup_{pi})-(pre_{pw-1}-pre_{pi})+w\times (pw-1)\)

\((sup_n-sup_{pw-1}+sup_{pi-1})\) 是不受操作影响的贡献。
\((sup_{pw-1}-sup_{pi})-(pre_{pw-1}-pre_{pi})\)\(i+1\sim pw-1\) 这些元素左移一位后的新贡献。
\(w\times (pw-1)\) 是新元素的贡献。

  • 如果 \(pw-1 < pi\):此时 \(pw\) 就是新排序后 \(x\) 在序列 \(a\) 的下标,那么答案就为 \((sup_n-sup_{pi}+sup_{pw-1})+(sup_{pi-1}-sup_{pw-1})-(pre_{pi-1}-pre_{pw-1})+w\times pw\)

与上面分析同理。

#include <bits/stdc++.h>
#define int long long#define endl "\n"using namespace std;const int N = 2e5 + 10;int n, q, a[N], w[N];
int pre[N], sup[N];// 寻找 a 数组中第一个 > / >= x 的位置
int binary(int flag, int x) { int l = 1, r = n, res = n + 1;while (l <= r) {int mid = (l + r) >> 1;if ((flag && a[mid] > x) || (!flag && a[mid] >= x)) res = mid, r = mid - 1;else l = mid + 1;}return res; 
}signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; i++)cin >> a[i], w[i] = a[i];sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) {pre[i] = a[i] + pre[i - 1];sup[i] = a[i] * i + sup[i - 1];}cin >> q;for (int p = 1, i, x; p <= q; p++) {cin >> i >> x;int posi = binary(0, w[i]);int posx = binary(1, x);if (posx - 1 >= posi) {int res = sup[posi - 1] + (sup[n] - sup[posx - 1]);cout << res + ((sup[posx - 1] - sup[posi]) - (pre[posx - 1] - pre[posi])) + x * (posx - 1) << endl;} else {int res = sup[posx - 1] + (sup[n] - sup[posi]);cout << res + ((sup[posi - 1] - sup[posx - 1]) + (pre[posi - 1] - pre[posx - 1])) + x * posx << endl;}}return 0;
}

P9187 [USACO23OPEN] Field Day S

首先将每个字符串转成 01 串,即二进制。

\(f(x,y)\) 表示 \(x,y\) 之间的汉明距离,则 \(f(x,y)+f(x,\neg y)=\text{ x 或 y 的长度}\)

根据上式,对于一个二进制数 \(x\),若 \(\neg x\) 与元素 \(y\) 构成最小汉明距离,\(x\) 与元素 \(z\) 构成最大汉明距离,那么 \(y=z\)。也就是说,我们只要求出没个数按位取反后的最小汉明距离就好了。

  • 状态设计\(f_i\) 表示 \(i\) 的最小汉明距离。
  • 转移方程\(f_{(2^j \oplus i)}=\min(f_{(2^j \oplus i)},f_{i}+1)\),这里 \(j\) 要放在外层循环枚举,不然会遇到未更新的 \(f_i\)
  • 状态初始化\(f_{a_i}=0\)

对于第 \(i\) 个元素,其对应答案为 \(c-f_{(2^c-1)-a_i}\)

#include <bits/stdc++.h>
#define int long longusing namespace std;const int N = 1e5 + 10;
const int M = (1 << 20);int n, m, a[N], f[M];signed main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 0; i < M; i++)f[i] = 1e5;for (int i = 1; i <= m; i++) {string s; cin >> s;for (int k = 0; k < s.size(); k++) {a[i] = a[i] * 2 + (s[k] == 'H');// 此处 G 代表 0,H 代表 1 }f[a[i]] = 0;}for (int j = 0; j < 20; j++)for (int i = 0; i < M; i++)f[(1 << j) ^ i] = min(f[(1 << j) ^ i], f[i] + 1);for (int i = 1; i <= m; i++)cout << n - f[a[i] ^ ((1 << n) - 1)] << endl;return 0;
}

P9188 [USACO23OPEN] Pareidolia S

赛时奇怪想法:link。

贪心挂了换 DP,有请雪仔 DP 分析法:

  • 状态设计:定义 \(dp_i\) 表示以 \(i\) 结尾的子串中 \(\texttt{bessie}\) 的数量。
  • 转移方程

我们从第 \(i\) 位倒过来找 \(\texttt{bessie}\),第一个 \(\texttt{bessie}\)\(\texttt{b}\) 在第 \(j\) 位:

\[dp_{i}=dp_{j-1}+j \]

  • 状态初始化\(dp_0=0\)

现在我们要解决 \(j\) 的查找效率不够高的问题了。

  • 状态设计:定义 \(f_i\) 表示到当前字符,最后一个 bessie 的前 \(i\) 个字母中 \(b\) 出现的位置
  • 转移方程:如果当前字符串为 \(\texttt{bessie}\) 的第 \(i\) 个字母,\(f_i=f_{i-1}\)。所以最后一个 \(\texttt{bessie}\) 中的 \(\texttt{b}\) 出现的位置为 \(f_6\),即当前 \(j=f_6\)
  • 状态初始化\(f_0=0\)

答案就是 \(\displaystyle\sum_{i=1}^n dp_i\)

#include <bits/stdc++.h>
#define int long longusing namespace std;const int N = 3e5 + 10;int f[9], ans, dp[N];
string s;signed main() {cin >> s;int len = s.size(); s = " " + s;for (int i = 1; i <= len; i++) {if (s[i] == 'b') f[1] = i;if (s[i] == 'e') f[6] = f[5], f[2] = f[1];if (s[i] == 's') f[4] = f[3], f[3] = f[2];if (s[i] == 'i') f[5] = f[4];dp[i] = dp[f[6] - 1] + f[6];}int ans = 0;for (int i = 1; i <= len; i++)ans += dp[i];cout << ans << endl;return 0;
}
http://www.jsqmd.com/news/1196314/

相关文章:

  • 百达翡丽中国官方售后服务中心|服务电话及详细地址权威信息通告(2026年7月更新) - 百达翡丽官方售后中心
  • 抖店一键下单软件真能自动统计利润?全套功能详解 - 电商分享
  • 芝柏官方售后服务中心详细网点地址与热线实地考察报告_多信源验证(2026年7月最新) - 亨得利官方服务中心
  • 电动车专线托运选哪个便宜又科普?电动车托运水太深?慧寄侠整车直达,260元起不拆电池真香! - 快递物流资讯
  • 【数据挖掘实战】从购物篮到推荐系统:Apriori与FP-Growth算法Python全解析
  • MATLAB版Chan算法TDOA定位实现:含三基站/多基站代码+实操视频
  • 抖店一件代发实操:一键下单工具运费模板、发货地址完整设置教程 - 电商分享
  • 在线一键去水印工具推荐:手机电脑微信小程序三端可用工具横评 - 科技热点发布
  • 从赛题到实战:运动目标控制与自动追踪系统的核心设计思路解析
  • 劳力士中国官方售后服务中心|地址与联系电话权威信息通知(2026年7月更新) - 劳力士服务中心
  • 伯爵中国官方售后服务中心|服务热线及官方维修地址权威信息声明(2026年7月最新) - 亨得利钟表维修中心
  • 衡阳市k式板房厂商选购指南 本地临建采购实用参考 - 热点品牌推荐
  • GOD:LLM 智能体社会的实时“控制室“——不止于观察,更要介入
  • Python asyncio 数据爬取:并发 100 个请求的正确姿势
  • 端侧大模型部署实战:突破内存、算力与碎片化三大瓶颈
  • 2026年除甲醛避坑指南:重庆源头厂家怎么选才靠谱? - 资讯纵览
  • C++/OpenCV 配置进阶:从“无法打开源文件”到正确引入opencv_contrib模块
  • Python入门实战:环境搭建、核心语法与首个项目开发指南
  • 从数学直觉到 AI 研究工程师:一本颠覆传统的开源自学教材全解析
  • 7.15做题记录(1)
  • 2026年7月最新重庆浪琴官方售后客户服务电话及线下网点地址 - 浪琴服务中心
  • TUSB8044 USB 3.1集线器寄存器配置实战:从原理到扩展坞设计
  • 2026年酸性清洗剂品牌厂商选型实用参考指南 - 热点品牌推荐
  • 2026年河北课程防工具适配本地需求选购指南 - 热点品牌推荐
  • 商城网站搭建平台哪个好,微商城和PC商城到底哪里不同
  • AI 指标异常根因分析:多维度关联比人工穷举快在哪
  • 船用割渔网刀具生产厂家选型采购及场景适配实用指南 - 热点品牌推荐
  • CBCX怎么样?一次围绕服务边界说明的理性复盘
  • C加加设计模式应用实战方法
  • 戴尔G15笔记本不开机故障维修:从待机电路到芯片级修复实战