JZOJ 5120 【2017.5.28提高组模拟】Summing Pieces

Description:

这里写图片描述

Input:

这里写图片描述

Output:

这里写图片描述

Sample Input:

Sample Input 0
3
1 3 6

Sample Input 1
5
4 2 9 10 1

Sample Output:

Sample Output 0
73
这里写图片描述
Sample Output 1
971

Data Constraint:

1<=n<=10^6
1<=ai<=10^9


题目大意:

给一个长度为n的序列,可以把它分成若干段,每次的价值为 ni=1a[i]i
求所有分法的贡献和。

吹水:

这道题其实不难,但是考场花了近2小时才弄出来,如果正式比赛这样就完了。
首先我想到的是确定每个点被覆盖了多少次,大概需要对覆盖区间的长度分类讨论,但是我没有去算样例,于是打了近一个多小时发现不对,我没有考虑除了这个区间的区间组合方案,再仔细思考得出我这个思路竟然是不行的(赛后讨论中有人说用这个思路做出来了%%%)。
于是想到了dp……

题解:

这个是分区间的问题,根据经验,我们很容易想到去dp。
fi 表示在i这里必须断开,1-i的所有方案的价值和。
gi 表示1-i分的方案数。
朴素dp:
gi=i1j=0gj
fi=i1j=0f[j]+g[j]sumj+1..i(ij)
我在打了表后才想到 gi=2i1

其实 fi 的dp是明显可以改进的。
fi1 fi 的dp有很多相同的地方,让我来写一下。
fi+1=ij=0f[j]+g[j]sumj+1..i+1(ij+1)
fi+1=i1j=0g[j]sumj+1..i+1(ij+1)+ij=0fj+giai+1
fi+1=i1j=0g[j](sumj+1..i(ij)+sumj+1..i+ai+1(ij+1))+ij=0fj+giai+1
fi+1=2fi+giai+1+i1j=0gj(sumj+1..i+ai+1(ij+1))

然后我们就发现后面只要维护一些东西的和就可以O(1)算了。
其实我比赛时写的式子不是这个,这个是乱推的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值