zoukankan      html  css  js  c++  java
  • HUD 5086 Revenge of Segment Tree(递推)


    http://acm.hdu.edu.cn/showproblem.php?pid=5086

    题目大意:

      给定一个序列,求这个序列的子序列的和,再求所有子序列总和,这些子序列是连续的。去题目给的第二组数据的

    3

    1 2 3

    这个序列的子序列有 [1]、[2]、[3]、[1、2]、[2、3]、[1、2、3],这些子序列的和是分别是1、2、3、3、5、6。再将这些和加起来

    1+2+3+3+5+6=20这个就是最终的答案。

    解题思路:

      我们假设n等于5。序列为1、2、3、4、5。然后我们将它们如下排列,每行表示一个序列

    1
    
    2
    1 2
    
    3
    2 3
    1 2 3
    
    4
    3 4
    2 3 4
    1 2 3 4
    
    5
    4 5
    3 4 5
    2 3 4 5
    1 2 3 4 5

    我们从中会发现序列中的a[i](表示序列第i个数),不管在那堆里面,a[i]有i个。总共有几个a[i]*i呢,可以看出有n-i+1个。
    所以推出公式为∑a[i]*i*(n-i+1)就是正确的答案了

    为什么我们要推公式,是因为我们暴力做的话时间复杂度是O(n^2),根据题目给的数据,肯定会超时。

    推出的公式的时间复杂度是O(n),题目给的数据,是不会超时的。

    AC代码:

     1 include<stdio.h>
     2 
     3 #define MOD 1000000007
     4 
     5 typedef __int64 LL;
     6 
     7 int main(){
     8     int t;
     9     LL sum, num, n;
    10     scanf("%d", &t);
    11     while(t--){
    12         scanf("%I64d", &n);
    13         sum = 0;
    14         for(LL i = 1; i <= n; ++i){
    15             scanf("%I64d", &num);
    16             sum = (sum + num * i % MOD * (n - i + 1) % MOD) % MOD;
    17         }
    18         printf("%I64d
    ", sum);
    19     }
    20     return 0;
    21 }
  • 相关阅读:
    POJ2253 Frogger
    搜索专题(复习)
    机器学习资料整理
    51nod 1873 初中的算术
    Canny检测理解和Matlab实现
    Floyd+限制路径步数(快速幂优化)
    bitset优化背包问题
    Educational Codeforces Round 44 (Rated for Div. 2)
    BZOJ 3224 SBT 普通平衡树
    本科课程大数据基础
  • 原文地址:https://www.cnblogs.com/xuqiulin/p/4068311.html
Copyright © 2011-2022 走看看