三亩地.
  • 首页
  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验
  • 实战教程
  • 编程思维
  • 资讯中心
  • 关于我们

资讯详情

深入了解每一个知识点

  • 首页
  • /
  • 资讯中心
  • /
  • 文章详情

ABC468

📅 2026/7/27 15:46:57 👁️ 阅读次数 📝 编程学习
ABC468

ABC468

第7次ak成就达成!但没进前百,手速有待提高~

C. Between P and Q

暴搜

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)using namespace std;int main() {int n;cin >> n;vector<int> p(n), q(n), a(n);rep(i, n) cin >> p[i];rep(i, n) cin >> q[i];rep(i, n) a[i] = i+1;int ans = 0;do {if (p < a and a < q) ++ans;} while (next_permutation(a.begin(), a.end()));cout << ans << '\n';return 0;
}

D. Pre-Palindrome

对每个回文中心做中心扩展

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)using namespace std;int main() {string s;cin >> s;int n = s.size();int ans = 0;rep(p, 2) {rep(sl, n-p) {int l = sl, r = sl+p, cnt = 0;while (0 <= l and r < n) {if (s[l] != s[r]) ++cnt;if (cnt > 1) break;++ans;--l; ++r;}}}cout << ans << '\n';return 0;
}

E. Sum of Average

要求的是所有连续子数组平均值的和:$$S = \sum_{1 \le l \le r \le N} \frac{\sum_{m=l}^r A_m}{r - l + 1}$$如果把长度倒数设为序列 \(B\),其中 \(B_k = \frac{1}{k+1}\),那么原式本质上是:每一个元素 \(A_j\) 与每一个长度倒数 \(B_k\) 乘积的组合累加。

对于固定的 \(A_j\) 和固定的长度倒数 \(B_k\),包含 \(A_j\) 且长度为 \(k+1\) 的子数组有多少个?

经过简单的边界推导,满足条件的子数组个数为:$$c(j, k) = \min(j + 1, N - j, k + 1, N - k)$$

因此,要求的总和可以写成:$$S = \sum_{j=0}^{N-1} \sum_{k=0}^{N-1} A_j \cdot B_k \cdot \min(j + 1, N - j, k + 1, N - k)$$

观察系数 \(c(j, k) = \min(j + 1, N - j, k + 1, N - k)\),可以将四项 \(\min\) 拆分为两组:

  • \(\min(j + 1, N - j)\) 是位置 \(j\) 距离数组两端的较小距离(加 1)。
  • \(\min(k + 1, N - k)\) 是长度 \(k\) 距离两端的较小距离(加 1)。

设 \(c(j, k) = M\),意味着存在 \(M\) 个层级 \(i\)(\(0 \le i < M\)),使得:

  • \(i \le \min(j, N - 1 - j)\) \(\iff\) \(j \in [i, N - 1 - i]\)
  • \(i \le \min(k, N - 1 - k)\) \(\iff\) \(k \in [i, N - 1 - i]\)

换句话说,我们可以按区间剥离的“层级 \(i\)”来交换求和顺序:$$S = \sum_{i=0}^{\lfloor (N-1)/2 \rfloor} \left( \sum_{j=i}^{N-1-i} A_j \right) \left( \sum_{k=i}^{N-1-i} B_k \right)$$

然后预处理以下 \(A\) 和 \(B\) 的前缀和即可

更形象的可以看下面这张图:

7.27

可以发现,对于第一层,整个矩阵都填上了 \(1\);对于第二层,往里缩一圈的矩阵继续填上 \(1\),\(\cdots\)

代码实现
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < (n); ++i)using namespace std;
using mint = modint998244353;int main() {int n;cin >> n;vector<int> a(n);rep(i, n) cin >> a[i];vector<mint> b(n);rep(i, n) b[i] = mint(i+1).inv();vector<mint> sa(n+1), sb(n+1);rep(i, n) sa[i+1] = sa[i]+a[i];rep(i, n) sb[i+1] = sb[i]+b[i];mint ans;for (int l = 0, r = n; l < r; ++l, --r) {ans += (sa[r]-sa[l])*(sb[r]-sb[l]);}cout << ans.val() << '\n';return 0;
}

F. Chmax

固定 \(x\) 的位置,然后求剩余数的 \(\text{LIS}\)

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)using namespace std;int main() {int n;cin >> n;vector<int> p(n);rep(i, n) cin >> p[i];int ans = 0;int mx = 0, lis = 0;const int INF = 1001001001;vector<int> dp(n, INF);rep(i, n) {if (mx < p[i]) {mx = p[i];ans++;}else {int j = lower_bound(dp.begin(), dp.end(), p[i]) - dp.begin();lis = max(lis, j+1);dp[j] = p[i];}}ans += lis;cout << ans << '\n';return 0;
}

G. Restricted Permutation

首先,根据题意可知 \(S\) 的首尾必须都是 o 才有解
注意到相邻两个 o 分隔出的不同段的填充方式是相互独立的,所以可以单独求每一段的填充方案数,然后乘起来就是答案
对于每一段的填充方案数可以用 \(\text{dp}\) + 简单容斥解决

代码实现
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < (n); ++i)using namespace std;
using mint = modint998244353;mint f(int w) {vector<mint> facs(w+2, 1);rep(i, w+1) facs[i+1] = facs[i]*(i+1);vector<mint> dp(w);rep(i, w) {dp[i] = facs[i+2];rep(j, i) dp[i] -= dp[j]*facs[i-j+1];}return dp[w-1];
}int main() {int n;string s;cin >> n >> s;mint ans = 1;if (s[0] != 'o' or s[n-1] != 'o') ans = 0;else {int w = 0;for (int i = 1; i < n; ++i) {w++;if (s[i] == 'o') ans *= f(w), w = 0;}}cout << ans.val() << '\n';return 0;
}
编程学习 技术分享 实战经验

相关新闻

冒险岛资源宝库:用WzComparerR2开启你的游戏逆向工程之旅

2026/7/27 15:46:57

古驰 GG Marmont 不值钱?无锡梁溪区二手行情大揭秘 - 全城热点

2026/7/27 15:46:57

LM36010EVM评估板实战:从硬件连接到GUI调试的LED驱动设计指南

2026/7/27 15:46:57

最新新闻

AI图片生成成本革命:Nano Banana 2实战解析

2026/7/27 16:44:38

敦化黄金回收怎么选不踩坑?4 大套路拆解 + 2 家本地老店实测推荐 - GrowUME

2026/7/27 16:44:18

3步搞定跨平台资源嗅探:爱享素材下载器终极指南

2026/7/27 16:44:35

日本麻将助手:雀魂与天凤玩家的终极智能分析工具

2026/7/27 16:44:18

LM96063智能热管理:高精度测温与PWM风扇控制集成方案详解

2026/7/27 16:44:18

BQ27Z746电量计安全认证与智能充电算法实战解析

2026/7/27 16:42:47

日新闻

SolidWorks许可证预测优化:数据驱动降本增效

2026/7/27 0:00:07

OpenClaw开源智能体网关:AI助手与即时通讯的完美融合

2026/7/27 0:00:43

BP神经网络优化永磁同步电机PI控制实践

2026/7/27 0:01:04

周新闻

数字身份克隆技术:Second Me开源项目解析与应用

2026/7/27 0:24:10

仅限本周开放|GMAT AI备考效能评估工具(含ETS官方题库行为轨迹比对模块),免费生成专属「提分热力图」与瓶颈突破路线图

2026/7/27 0:59:34

技术焦虑下的业务聚焦:构建可持续的技术竞争力

2026/7/27 11:50:02

月新闻

[C++]内存管理:串顺序存储的内存回收

2026/7/26 9:09:24

足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建

2026/7/26 9:09:24

抖音内容监控助手:告别手动刷新,让优质内容主动找你

2026/7/25 11:18:11

分类目录

  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验

热门标签

JavaScript Python Java 前端开发 后端开发 算法 数据结构 项目实战

关于三亩地

三亩地是一个专注于编程学习的平台,以真实学习日记为载体,分享编程学习经验、项目实操技巧和高效学习方法。

快速链接

学习日记

项目实战

学习方法

资讯中心

联系方式

邮箱:contact@mfbz.cn

微信:sanmudi_code

QQ 群:123456789

© 2026 三亩地 编程学习日记 版权所有 | mfbz.cn