#include <iostream>
#include <queue>
using namespace std;
int n;
long t[500000];
int find_left(int index){
//vector<int>p;
long power=0;
for (int i = index-1; i >=0; i--)
{
//cout<<t[i]<<endl;
//if(t[i]>0)
power+=t[i];
//p.push_back(t[i]);
if(power>=-t[index])
return index-i;
}
return 0-1;
}
vector<int> find_right(int index){
vector<int>p;
long power=0;
for (int i = index+1; i < n; i++)
{
//if(t[i]>0)
power+=t[i];
p.push_back(t[i]-power);
if(power>=-t[index])
return p;
}
p.resize(0);
return p;
}
int main(){
int length=0;
int left;
vector<int>right;
cin>>n;
for(int i=0;i<n;i++){
cin>>t[i];
}
for(int i=0;i<n;i++){
if(t[i]<0){
left=find_left(i);
right=find_right(i);
//cout<<i<<" "<<left<<" "<<right<<endl;
if(left==-1&&right.size()==0){
cout<<-1;
return 0;
}
else if(left==-1){
length+=right.size();
for (int j = i; j < i+right.size(); j++)
{
t[j]+=right[j-i];
}
}
else if(right.size()==0)
length+=left;
else{
if(left<right.size())
length+=left;
else
{
length+=right.size();
for (int j = i; j < i+right.size(); j++)
{
t[j]+=right[j-i];
}
}
}
}
}
cout<<length;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <iostream> #include <queue> using namespace std; int n; long t[500000]; int find_left(int index){ //vector<int>p; long power=0; for (int i = index-1; i >=0; i--) { //cout<<t[i]<<endl; //if(t[i]>0) power+=t[i]; //p.push_back(t[i]); if(power>=-t[index]) return index-i; } return 0-1; } vector<int> find_right(int index){ vector<int>p; long power=0; for (int i = index+1; i < n; i++) { //if(t[i]>0) power+=t[i]; p.push_back(t[i]-power); if(power>=-t[index]) return p; } p.resize(0); return p; } int main(){ int length=0; int left; vector<int>right; cin>>n; for(int i=0;i<n;i++){ cin>>t[i]; } for(int i=0;i<n;i++){ if(t[i]<0){ left=find_left(i); right=find_right(i); //cout<<i<<" "<<left<<" "<<right<<endl; if(left==-1&&right.size()==0){ cout<<-1; return 0; } else if(left==-1){ length+=right.size(); for (int j = i; j < i+right.size(); j++) { t[j]+=right[j-i]; } } else if(right.size()==0) length+=left; else{ if(left<right.size()) length+=left; else { length+=right.size(); for (int j = i; j < i+right.size(); j++) { t[j]+=right[j-i]; } } } } } cout<<length; return 0; } |
English