CF1009E [Intercity Travelling]

编程入门 行业动态 更新时间:2024-10-17 21:19:24

CF1009E [<a href=https://www.elefans.com/category/jswz/34/1682963.html style=Intercity Travelling]"/>

CF1009E [Intercity Travelling]

这道题先考虑一种暴力n方做法

设\(f_i\)表示到\(i\)点所有情况的困难度之和(\(f_0=0\)),\(pre_i=\sum_{j=1}^{i} a_j\)

考虑从点\(j\)中途不经过休息站到达\(i\),可以得到\[f_i=pre_i+\ \sum_{j=1}^{i-1} f_j+2^{j-1}pre_{i-j}\]

(要乘\(2^{j-1}\)是因为到第\(j\)个点有那么多方案)

这个很容易就能优化到\(O(n)\)

记\(g_i=\sum_{j=1}^{i} f_j,h_i=pre_i+\sum_{j=1}^{i-1} 2^{j-1}pre_{i-j}=\sum_{j=1}^{i}2^{i-j}a_j=2h_{i-1}+a_i\)

所以\[f_i=g_{i-1}+h_i\]

直接\(O(n)\)救星了,也不要多开数组

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db doubleusing namespace std;
const int mod=998244353,N=1000000+10;
il LL rd()
{re LL x=0,w=1;re char ch;while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
LL n,a[N],an,ss,bb; //乱定变量名(逃int main()
{n=rd();for(int i=1;i<=n;i++) a[i]=rd();for(int i=1;i<=n;i++){bb=((bb<<1)%mod+a[i])%mod;an=(ss+bb)%mod;ss=(ss+an)%mod;}printf("%lld\n",an);return 0;
}

转载于:.html

更多推荐

CF1009E [Intercity Travelling]

本文发布于:2024-02-11 19:33:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682953.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:CF1009E   Intercity   Travelling

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!