当前位置: 首页 > 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.jsqmd.com/news/37044/

相关文章:

  • 降AI总踩坑?关键看这3点选对工具
  • 逆向 | 逃离鸭科夫 unity mono游戏hook
  • AI降重避坑指南:如何有效降低论文AI检测率?
  • 降AI攻略:博主实测经验分享
  • 论文降AI,如何高效又保真? - BUAA
  • 20251110 之所思 - 人生如梦
  • import { random, guid } from uview-plus;报错找不到uview-plus
  • *题解:P3960 [NOIP 2017 提高组] 列队
  • PyTorch - whats the difference between models training mode and evaluation mode?
  • 【CI130x 离在线】C++ 11智能指针 std::unique_ptr
  • Doxygen 入门
  • 第21天(简单题中等题 二分查找、排序)
  • CSAPP学习笔记(施工中)
  • 当Mb连不上虚拟机的时候,这是因为啥?我应该怎么解决?? - fish666
  • 计算不确定度
  • 会议开了一整天,记录却只有三行?
  • Day17盒子模型中设置外边距时的问题
  • 基于Github Action 配置Java Python Go. Rust Nodejs C++ 实现自动发布功能
  • File文件
  • 2025 年 11 月蔬菜配送厂家推荐排行榜,新鲜生鲜水果,有机食堂食材,生鲜蔬菜配送中心,蔬菜配送平台,新鲜蔬菜配送上门公司推荐
  • TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras构建逻辑回归
  • 2025 年 11 月食堂承包厂家推荐排行榜:学校、工厂、企业、单位、医院、工地、科技园、工业园、产业园、养老院食堂承包公司精选
  • 2025年保洁公司权威推荐榜单:驻场保洁/钟点保洁/开荒保洁/外包保洁/商场保洁/办公楼保洁/工厂保洁/医院保洁/企业保洁服务优选指南
  • 今天学的是编译型与解释型的运行流程
  • 在线甘特图工具选型指南:5款产品深度对比评测
  • 2025 年 11 月食堂承包厂家推荐排行榜,学校食堂承包,工厂食堂承包,企业单位食堂承包,医院工地科技园食堂承包公司优选
  • 漏洞赏金实战:我是如何轻松获得2500美元奖金的
  • 华为网络设备重启-保存-清楚配置恢复出厂配置命令
  • 2025.11.10总结
  • 2025 年 11 月 PFA 隔膜阀厂家推荐排行榜,PFA 隔膜阀,防腐隔膜阀,高纯隔膜阀,耐酸碱隔膜阀公司推荐