2015-03-03 72 views
2

这里的总和是问题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; 
} 

人给我提示为更好的算法和数据结构,这个任务

+0

您能否为问题添加一些说明,而不仅仅是链接:)? – 2015-03-03 07:17:50

+0

我可以添加说明,但它会使这个问题很长...这就是为什么我只是添加链接 – 2015-03-03 07:23:44

+0

嗯,我可以帮助你,如果你不介意:)这是本网站的要求之一,它可以帮助你以获得更好的回应,并帮助其他:) – 2015-03-03 07:25:11

回答

1

对于每个测试用例,你可以保持binary search tree,这样你可以找到n个元素的中位数O(log n) time,而你只需要O(log n)的时间增加树中的新元素。因此,我们有一个O(T * nlogn)算法,其中T是测试用例的数量,n是元素的数量,它应该足以通过。

+0

我曾经想过使用stl(priority_queue)实现这个..但比我想我会仍然导致我TLE..BST是我能做的最好的。感谢建议 – 2015-03-03 07:22:27

+0

保持BST *平衡*是很重要的,所以你只需要考虑根和可能的孩子找到中位数。否则(例如,如果所有输入的顺序都是递增的),你的BST可能看起来像一个链表,并且每个测试用例的运行时间将膨胀到O(n^2)。 – 2015-03-03 12:48:27

相关问题