《牛客练习赛63-C》

序列卷积之和

https://ac.nowcoder.com/acm/contest/5633/C

思路:前缀和优化.
一层层去优化掉循环.
至于怎么优化?写成L,r的形式就可以慢慢优化成
ans += (sum4[n]-sum4[L-1])-sum[L-1](sum3[n]-sum3[L-1])-(sum5[n]-sum5[L-1])+sum2[L-1](n-L+1);这样的一维循环.
细节讲一下:因为涉及到了减的操作,所以注意+Mod然后%Mod来防负数.
然后因为我这代码里把后面分开来下了,那个+应该是-.
Code:

LL a[N];
LL sum[N];//a值的前缀和
LL sum2[N];//a[i]*sum[i-1]的前缀和
LL sum3[N];//sum[i]的前缀和
LL sum4[N];//sum[i]^2的前缀和
LL sum5[N];//sum2的前缀和.
/*
ans += (sum4[n]-sum4[L-1])-sum[L-1]*(sum3[n]-sum3[L-1])-(sum5[n]-sum5[L-1])+sum2[L-1]*(n-L+1);
*/
int main()
{
    int n;sd(n);
    for(int i=1;i<=n;++i) 
    {
        sld(a[i]);
        sum[i] = (sum[i-1]+a[i])%Mod;
        sum2[i] = (sum2[i-1]+(a[i]*sum[i-1])%Mod)%Mod;
        sum3[i] = (sum3[i-1]+sum[i])%Mod;
        sum4[i] = (sum4[i-1]+(sum[i]*sum[i])%Mod)%Mod;
        sum5[i] = (sum5[i-1]+sum2[i])%Mod;
    }
    LL ans = 0;
    for(int L=1;L<=n;++L)
    {
        LL ma1 = ((sum4[n]-sum4[L-1])%Mod-(sum[L-1]*((sum3[n]-sum3[L-1])%Mod))%Mod)%Mod;
        ma1 = (ma1+Mod)%Mod;
        LL ma2 = ((sum5[n]-sum5[L-1])%Mod-(sum2[L-1]*(n-L+1))%Mod)%Mod;//注意因为是直接-ma2,所以中间应该是-,才能像原式一样,-ma2时变成+.
        LL ma = ((ma1-ma2)%Mod+Mod)%Mod;//防负数
        ans = (ans+ma)%Mod;
    }
    plr(ans);
    system("pause");
    return 0;
}
全部评论

相关推荐

佛系的本杰明反对画饼:个人看法,实习经历那段是败笔,可以删掉,它和你目标岗位没什么关系,没有用到什么专业技能,甚至会降低你项目经历内容的可信度。个人技能那里可以再多写一点,去boss直聘上看别人写的岗位要求,可以把你会的整合一下,比如熟悉常规的开关电源拓扑结构(BUCK、正激、反激、LLC等),熟悉常用的通信总线协议和通信接口,如UART,IIC,SPI等。简历首先是HR看的,HR大多不懂技术,会从简历里去找关键字,你没有那些关键字他可能就把你筛掉了,所以个人技能尽量针对着岗位描述写一下。还有电赛获佳绩,获奖了就写什么奖,没获奖就把获佳绩删了吧,要不会让人感觉夸大。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务