我阅读了所有关于错误(SIGABRT)的原因的信息 - >使用数组制作了这个程序,这给了我SIGSEGV。请告诉我在哪里,我要求编译器无法分配的内存或将其缩小到精确的问题以及它所在的位置?
约束如下所述,我使用了long long int
Bi + 1< Bi为每个有效的i
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int main() {
ll T;
cin>>T;
while(T--){
ll N,K;
cin>>N>>K;
vector<ll> A(N,0);
vector<ll> D(N,0);
vector<ll> B(N,0);
for(ll i=0; i<N ; i++){ // O(N)
cin>>A[i];
}
for(ll i=0; i<N ; i++){ // O(N)
cin>>D[i];
}
for(ll i=0; i<K ; i++){ // O(K)
cin>>B[i];
}
ll vect_size=0;
for(ll i=0; i<N ; i++) // O(N)
vect_size += D[i] ;
//cout<<vect_size<<endl;
vector<ll> cards(vect_size,0);
ll sum=0;
for(ll i=0; i<N ; i++){
for(ll j=0; j<D[i] ; j++){
cards[ sum+j ] = A[i] ;
}
sum+=D[i];
}
//sort(cards, cards+vect_size ); // O(N.logN) :: N = vect_size
sort(cards.begin(), cards.end());
//----------------------game-begins-now-----------------------------------------
ll left_lim=0;
ll right_lim=vect_size-1;
ll cur_size=vect_size;
for(ll i=0; i<K; i++){
if( i%2==0 ){
left_lim += cur_size-B[i] ;
cur_size = B[i];
}
else{
right_lim -= cur_size-B[i];
cur_size = B[i];
}
}
sum=0;
for(ll i=left_lim; i<=right_lim; i++)
sum += cards[i];
cout<<sum<<"\n";
}
return 0;
}
答案 0 :(得分:1)
我不清楚你遇到的问题是什么(例如,哪一行引发错误),但这可以让你开始:
使用std::vector<ll>::max_size()
获取最大允许大小。
这可能是2^30-1
。
检查你是否超过了。
如果N < vect_size
,行cards[ sum+j ] = A[i]
是个问题。
vect_size
最多可以LONG_MAX * LONG_MAX
(请参阅climits)。
LONG_MAX
可能2^31-1
或更高,因此LONG_MAX * LONG_MAX
可能约为2^62
。 vector
,可以想象超过第1点的限制。
这可能不是你想要的。
根据sum += cards[i]
的具体内容,唯一可能有问题的行是utf-8
。