贡献思想

贡献度思想是什么,贡献度思想就是把对答案有贡献的区间都列出来,把对答案没贡献的区间都舍去。为什么会有对答案没贡献的区间呢,因为在这个区间里,这个数字前面有和它相同的数字,我们只需要保留前面那个区间就行。

例如:

对没有重复数字的样例1来说

序号 1 2 3 4 5
ai 1 2 3 4 5
①a1=1对答案的贡献度区间为[1,1],[1,2],[1,3],[1,4],[1,5] 有1*5个

②a2=2对答案的贡献度区间为

[1,2],[1,3],[1,4][1,5]

[2,2],[2,3],[2,4],[2,5] 有2*4个

③a3=3对答案的贡献度区间为

[1,3],[1,4],[1,5]

[2,3],[2,4],[2,5]

[3,3],[3,4],[3,5] 有3*3个

④a4=4对答案的贡献度区间为

[1,4],[1,5]

[2,4],[2,5]

[3,4],[3,5]

[4,4],[4,5] 有4*2个

⑤a5=5对答案的贡献度区间为

[1,5]

[2,5]

[3,5]

[4,5]

[5,5] 有5*1个

由样例1我们可以知道,在序列中,对ai来说,当前面没有与之相同的数的时候,那么ai对答案的贡献度区间为i*(n-i+1).

答案就是1*5*1+2*4*2+3*3*3+4*2*4+5*1*5=105.

以上就是没有重复数字时,这道题的解法。

对有重复数字的样例3来说

序号 1 2 3 4
ai 2 3 3 2
①a1=2对答案的贡献度区间为[1,1],[1,2],[1,3],[1,4] 有1*4个

②a2=3对答案的贡献度区间为

[1,2],[1,3],[1,4]

[2,2],[2,3],[2,4] 有2*3个

③a3=3对答案的贡献度区间为

[3,3],[3,4] 有1*2个 (由于第2个数字也为3,因此[1,3],[1,4] [2,3],[2,4]与上面的重复了,我们舍去)

④a4=2对答案的贡献度区间为

[2,4]

[3,4]

[4,4] 有3*1个 (由于第1个数字也为3,因此[1,4]与上面的重复了,我们舍去)

从样例3我们可以知道,我们设前面第一个与ai相同的数字的位置是pos[a[i]],那么ai的贡献度区间有(i-pos[a[i]])*(n-i+1).

那么答案就是1*4*2+2*3*3+1*2*3+3*1*2=38.

好处:

如果直接使用暴力的算法的话,时间复杂度为O(n^2),避免不了求区间的情况,但如果使用求贡献度的思维去求,可以在O(n)的时间复杂度内完成

摘自原文链接:https://blog.csdn.net/qq_45328552/article/details/109023946

例题:B-Beauty Values_2022牛客国庆集训派对day6 (nowcoder.com)

posted @ 2022-10-06 14:50  清初  阅读(65)  评论(0)    收藏  举报