AT_abc230_f [ABC230F] Predilection 题解

prologue

各位在比赛的时候一定要坚信自己的式子,然后去考虑自己的实现是不是挂了。本人在今天模拟赛的时候质疑自己的式子然后不看实现 100 -> 0。

analysis

考虑对这个给定数组进行前缀和,然后就将问题转化成为了求这个前缀和数组的子序列的个数。对于求子序列,我们很轻松可以写出来这个式子。

下面 pre 表示这个数字(前缀和)之前出现的位置。

fi{fi1×2+1ifprei=0fi1×2fprei1ifprei0

code time

read, ww 和 flush 是我的快读快写带的函数,含义大家应该都能想到吧。

喜提最优解 23ms。

#include <bits/stdc++.h> using namespace std; #define ll long long #define rl register ll #define fom(i, a) for(rl i=a; i; -- i) #define foa(i, a, b) for(rl i=a; i < b; ++ i) #define fos(i, a, b) for(rl i=a; i <= b; ++ i) #define fop(i, a, b) for(rl i=a; i >= b; -- i) const ll N = 5e5 + 10, P = 998244353; ll n, a[N], f[N]; unordered_map<ll, ll> pre; int main() { read(n); fos(i, 1, n) read(a[i]), a[i] += a[i - 1]; foa(i, 1, n) f[i] = ((f[i - 1] << 1 | 1) - (pre.find(a[i]) == pre.end() ? 0 : f[pre[a[i]] - 1] + 1) + P) % P, pre[a[i]] = i; ww(f[n - 1] + 1); return flush(), 0; }

__EOF__

本文作者carp
本文链接https://www.cnblogs.com/carp-oier/p/AT_abc230_f.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   carp_oier  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示