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

做题记录 #5

A. CF2135E1 Beyond the Palindrome (Easy Version) (7.5)

2025.11.10

容斥好题。首先发现这个消除 10 子串类似一个括号序列,最后只会剩下 前缀一堆 \(0\) 和 后缀一堆 \(1\)。经典 trick 转 \(\pm 1\) 前缀和折线,令 \(0\)\(-1\)\(1\)\(+1\),那么不难发现前面 \(0\) 的个数是 \(-\min pre\) 个。反转后的前缀和折线,可以发现刚好是原折线绕 \((n,pre_n)\) 旋转 \(180^\circ\),因此不难得到 \(\max pre - pre_n = -\min pre\),即 \(\max pre + \min pre = sum\)。非常好的转化。

那么接下来怎么做呢?可以枚举这个折线的值域,即 \(\max=u\)\(\min=d\)。此时非常想要反射容斥,但是这个条件是“恰好”的,不好处理,考虑容斥成 \((d, u) - (d + 1, u) - (d, u - 1) + (d + 1, u - 1)\),就可以改成 \(\max \leq u, \min \geq d\) 了。

于是考虑反射容斥。与 Catalan 的反射容斥不太相同,它有两条线卡着。但是反思反射容斥的过程,我做一次反射可以容斥完所有的只触碰当前 \(y=i\) 这个限制直线 的方案,所以连续的触碰同一个限制是无需考虑的,我只需要考虑交替的触碰。当然,会有两种交替的方式(向上或向下)。由于 \(x=n\) 的情况下无法走到 \(|y| > n\) 的点位,而且每两次反射都会增长 \(2(u-d)\) 的纵坐标绝对值,因此做一个 \((d,u)\) 的复杂度是 \(\mathcal{O}(\frac{n}{u-d})\) 的。暴力枚举 \(n^2\ln n\)

发现我有很多的 \(u-d\) 相同,他们考虑的反射其实是类似的,我们可以直接把它连起点平移到 \((0, u-d)\) 的限制中。此时,起点是 \((0, 0\sim u-d)\),对应的终点是 \((n, u-d\sim 0)\)。不难发现我做的翻折不会给点横坐标带上系数,因此每个起点对应的终点横坐标一定也是段区间。此时存在两种情况,一种差值全相等,组合数直接乘起点数即可;另一种差值是个公差为 \(2\) 的等差数列,考虑到 \((0, 0)\rightarrow (n, x)\) 的方案数其实是 \(n\choose (n+x)/2\),因此是个组合数区间和,总数都是 \(n\),预处理一下前缀和即可。时间复杂度 \(\mathcal{O}(n\ln n)\)

代码细节挺多,因为会有上面容斥的 减去项,需要深思熟虑。今天状态有点差,想不明白这个 E2,看题解也没有很懂,但是感觉是特殊化的推式子,感觉不太 educational,故没有补/hsh

Code
// STOOOOOOOOOOOOOOOOOOOOOOOOO hzt CCCCCCCCCCCCCCCCCCCCCCCORZ
#include <algorithm>
#include <cassert>
#include <iostream>
#include <numeric>
#include <vector>using namespace std;
using LL = long long;
using PII = pair<int, int>;
constexpr int kN = 1e6 + 1, kP = 998244353;int T, n;
int inv[kN], a[kN];
LL sum[kN];
LL Get(int l, int r) {l > r && (swap(l, r), 0);return sum[min(r, n)] - (l > 0 ? sum[l - 1] : 0);
}
int Func(int d, bool o) {LL ret = 0, len = d + 2 - o;for (int k = 0, l; (l = (n + d - o) / 2 - k * len) >= 0; k++)  //* UDret += Get((n - d) / 2 - k * len, l);for (int k = 1, r; (r = (n - d) / 2 + k * len) <= n; k++)  //* DUret += Get(r, (n + d) / 2 - o + k * len);for (int k = 0, p; (p = (n - d) / 2 - 1 - k * len) >= 0; k++)  //* Dret -= (d + 1ll - o) * a[p] % kP;for (int k = 1, p; (p = (n - d) / 2 - 1 + k * len) <= n; k++)  //* Uret -= (d + 1ll - o) * a[p] % kP;return (ret % kP + kP) % kP;
}
int main() {
#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("output.out", "w", stdout);
#endifcin.tie(0)->sync_with_stdio(0);inv[1] = 1;for (int i = 2; i < kN; i++)inv[i] = 1ll * (kP - kP / i) * inv[kP % i] % kP;for (cin >> T; T--;) {cin >> n, sum[0] = a[0] = 1;for (int i = 1; i <= n; i++) {a[i] = 1ll * a[i - 1] * inv[i] % kP * (n - i + 1) % kP;sum[i] = (sum[i - 1] + a[i]) % kP;}LL ans = 0;for (int d = 2 - (n % 2), lst = 0; d <= n; d += 2) {ans += lst;ans += (lst = Func(d, 0));ans -= 2 * Func(d, 1);}cout << (ans % kP + kP) % kP << '\n';for (int i = 0; i <= n; i++)sum[i] = a[i] = 0;}return 0;
}
http://www.rkmt.cn/news/45983.html

相关文章:

  • 降AI总踩坑?关键看这3点选对工具
  • AI降重避坑指南:如何有效降低论文AI检测率?
  • PyTorch - whats the difference between models training mode and evaluation mode?
  • 【CI130x 离在线】C++ 11智能指针 std::unique_ptr
  • 第21天(简单题中等题 二分查找、排序)
  • 计算不确定度
  • File文件
  • 2025 年 11 月蔬菜配送厂家推荐排行榜,新鲜生鲜水果,有机食堂食材,生鲜蔬菜配送中心,蔬菜配送平台,新鲜蔬菜配送上门公司推荐
  • TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras构建逻辑回归
  • 2025年保洁公司权威推荐榜单:驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁服务优选指南
  • 今天学的是编译型与解释型的运行流程
  • 2025 年 11 月 PFA 隔膜阀厂家推荐排行榜,PFA 隔膜阀,防腐隔膜阀,高纯隔膜阀,耐酸碱隔膜阀公司推荐
  • Django中使用应用自定义配置
  • 希尔排序快速排序归并排序
  • 2025 年 11 月粘度计厂家推荐排行榜,在线粘度计,旋转粘度计,振动粘度计,实验室旋转粘度计,反应釜在线粘度计公司推荐
  • flask: 用Flask-Uploads实现文件上传
  • 2025 年 11 月冲压件厂家推荐排行榜,新能源冲压件,光伏冲压件,精密冲压件,异形冲压件,五金冲压件,铝冲压件,汽配冲压件,不锈钢冲压件,家具冲压件公司推荐
  • 日总结 24
  • P4511 日程管理
  • 新编故事 | 噪音
  • 20232303 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 2025 年 11 月润滑油厂家推荐排行榜,工业润滑油,汽车润滑油,发动机润滑油,甲醇发动机润滑油,全合成润滑油公司精选
  • 172. 阶乘后的零
  • 微服务已死?别再盲目跟风微服务!这3种情况下单体架构更适合你。
  • Oracle LogMiner实战指南:误删误改数据的救命稻草
  • Spring 事务 - 实践
  • Spring AI Alibaba 项目源码学习(二)-Graph 定义与描述分析
  • 20232422 2024-2025-1 《网络与系统攻防技术》实验四实验报告
  • SPI 设备与多从机冲突的解决之道:片选管理、CS 去抖与总线隔离策略 - 实践
  • pythontip 字符串转为字典