更好解决方案的方法 - 中位数的总和

时间:2015-03-03 07:01:20

标签: algorithm data-structures

以下是问题Spoj-WEIRDFN

问题

让我们定义:

F[1] = 1
F[i] = (a*M[i] + b*i + c)%1000000007 for i > 1

其中M[i]是数组{F[1],F[2],..,F[i-1]}的中位数 给定a,b,c和n,计算总和F[1] + F[2] + .. + F[n]

约束

0 <= a,b,c < 1000000007
1 <= n <= 200000

我想出了一个效率不高的解决方案

我的解决方案:: -

#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define mod 1000000007
int main() {
    // your code goes here
    int t;
    scanf("%d",&t);
    while(t--)
    {
      ll a,b,c,sum=0;
      int n;
      scanf("%lld%lld%lld%d",&a,&b,&c,&n);
      ll f[n+1];
      f[1]=1;
      f[0]=0;
      for(int i=2;i<=n;i++)
      {  
          ll temp;
          sort(&f[1],&f[i]);
          temp=f[i/2];
          f[i]=((a*(temp)%mod)+((b*i)%mod)+(c%mod))%mod;
          sum+=f[i];
      }
      printf("%lld\n",sum+f[1]);
    }
    return 0;
}

任何人都可以提示我为此任务提供更好的算法或数据结构

1 个答案:

答案 0 :(得分:1)

对于每个测试用例,你可以保持一个binary search tree,这样就可以找到O(log n) time中n个元素的中位数,你只需要O(log n)时间就可以添加一个新元素树。

因此,我们有一个 O(T * nlogn)算法,其中T是测试用例的数量,n是元素的数量,应该足以通过。