尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

【模拟赛总结】20260714 模拟赛总结
📅 发布时间:2026/7/15 22:17:04

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;
}

相关新闻

  • 百达翡丽中国官方售后服务中心|服务电话及详细地址权威信息通告(2026年7月更新) - 百达翡丽官方售后中心
  • MATLAB版Chan算法TDOA定位实现:含三基站/多基站代码+实操视频
  • 衡阳市k式板房厂商选购指南 本地临建采购实用参考 - 热点品牌推荐

最新新闻

  • ShaderGraph点积节点核心原理与应用:从向量数学到边缘光、菲涅尔效果实战
  • 计算机毕业设计之基于SpringBoot的住院管理系统
  • ImGui五分钟入门:C++轻量级GUI开发实战指南
  • 高速信号调理实战:TI DS280DF810重定时器核心参数与调试指南
  • 微服务的契约测试与兼容性
  • 龙虾 AI 企业版下载推荐:2026本地智能体官方下载渠道与企业选型参考

日新闻

  • 告别启动盘残留:用Diskpart彻底清除U盘EFI分区与恢复完整空间
  • 2026 年宜春诚信的塑料缠绕膜厂家哪个好,缠绕膜背后的秘密:你不知道的成本陷阱 - 领域鉴赏官
  • Arch ECS 入门指南:10分钟掌握C#高性能数据驱动架构

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号