Я отладил ваш код, а также измененный код был принят для указанного выше вопроса .
Ошибки, которые вы сделали:
1. В приведенном ниже l oop, значение i'th index
из vector<int> b
добавляется к long int s
. Вместо этого b[k]
следует добавить к long int s
, потому что переменная , используемая в l oop, равна k
, а не i
.
for (int k = 0; k< b.size(); k++) {
s += b[i];
}
2. В вопросе диапазон variable n
задается как (1 ≤ n ≤ 2,10 ^ 5) . Таким образом, можно безопасно использовать int n
вместо long int n
. Кроме того, когда я отправил свой код на codeforces, он дал мне ошибку переполнения целого числа со знаком , когда я использовал long int n
.
3. Вам нужно использовать long long s
вместо long int s
, потому что значение каждого элемента массива A находится между (- 10 ^ 9 ≤ a [i] ≤ 10 ^ 9, ai ≠ 0) , и когда мы добавляем элементы, он может легко превосходит int
и long int
диапазоны .
4. Хотя, ответ был принят, когда я использовал vector<int> a
в функции
int check(int i,vector<int> a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
Но, как сказал и прав пользователь Шефф, это связано с ограничением пространства и времени, вы должны использовать вызов по ссылке, т.е. vector<int> &a
.
Модифицированный код:
#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i, vector<int> &a) {
if (a[i] > 0) {
return 1;
}
else return 0;
}
int main() {
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> a(n), b;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int i = 0;
while (i < n)
{
int max = a[i];
int s = check(i,a);
i++;
while ((i<n) && (check(i,a)== s)) {
if (a[i] > max)
max = a[i];
i++;
}
b.push_back(max);
}
long long s = 0;
for (int k = 0; k< b.size(); k++) {
s += b[k];
}
cout << s << endl;
}
}
Скриншот принятого ответа: