2016-11-02 4 views
0

n 개의 요소에 배열이 있습니다 (1 < = n < = 200000). 나는이 배열로부터 형성 될 수있는 모든 연속적인 하위 배열의 합을 발견한다고 가정한다. 나는 모든 합계를 찾을 O (n^2) 알고리즘을 가지고 있지만 내 문제는 n (n + 1)/2 요소가 있기 때문에 어떤 데이터 구조에도 저장할 수 없다는 것입니다. 따라서 큰 공간을 필요로하는 10^10 요소가 있습니다. 이것은 제가 얻고있는 결과입니다.배열의 모든 인접한 부분 배열의 합계를 저장하는 방법은 무엇입니까?

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted (core dumped)

내가 너무 많은 메모리를 사용하기 때문에 내 코드의를 생각한다. 다음은 내 코드입니다.

#include <bits/stdc++.h> 
using namespace std; 
typedef long long int lli; 
#define vi vector<int> 
#define vli vector<lli> 
#define dqi deque<int> 
#define MOD 10e9+7 
#define mis map<int,string> 
#define msi map<string,int> 
#define set0(a) memset(a,0,sizeof(a)) 
#define sc scanf 
#define pr printf 
#define rint(a) sc("%d",&a) 
#define rchar(a) sc("%d",&a) 
#define pb push_back 
#define pf push_front 
#define rstring(s) sc("%s",&s) 
#define rp(a,b,c) for(int (a)=(b);(a)<(c);(a)++) 
#define rpn(a) while(a--) 
int a[200010],t=0,n=0,q=0,cnt=0; 
vector<long long int> b; 
long long int l=0,r=0; 
int main() 
{ 
    freopen("in.txt","r",stdin); 
    freopen("out.txt","w",stdout); 
    memset(a,0,sizeof(a)); 
    scanf("%d",&t); 
    while(t--){ 
    scanf("%d %d",&n,&q); 
    for(int i=0;i<n;i++) 
     scanf("%d",&a[i]); 
    long long int sum=0; 
    for(int i=n-1,j=1;i>=0;i--,j++){ 
     b.push_back(a[i]);sum=a[i]; 
     for(int j=i+1;j<=n-1;j++) 
       b.push_back(sum+=a[j]); 
    } 
    //following part find the sum of elements of subarrays in a given range after sorting them 
    printf("Case #%d: \n",++cnt); 
    while(q--){ 
     scanf("%lld %lld",&l,&r); 
     long long int sum=0; 
     for(long long int i=l-1;i<r;i++) 
      sum+=b[i]; 
     printf("%lld\n",sum); 
    } 
    b.clear(); 
} 
return 0; 
} 

다른 방법이 있습니까? 안내해주십시오.

+1

매크로없이 코드를 재구성 할 수 있습니까? –

+0

매크로가없는 코드. – Midhun

+2

당신은 무엇이 원하는지 불분명합니다. 모든 인접한 하위 배열의 합을 찾고 싶습니다. 그런 다음 무엇을합니까? 모든 금액을 저장 하시겠습니까? 모든 금액을 출력 하시겠습니까? 또는 무엇을? – user31264

답변

관련 문제