Cod sursa(job #3148266)

Utilizator PescarusTanislav Luca Andrei Pescarus Data 30 august 2023 14:37:51
Problema Subsecventa de suma maxima Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <climits>

using namespace std;
ifstream f("ssm.in");
ofstream g("ssm.out");

int a[6000005];
int n;

struct ssm {
  int sum, left, right;
};

ssm solve(int left, int right){
  if(left == right){
    return {a[left], left, right};
  }
  //divide et impera si aici avem cazurile cans secventa e in stanga sau in dreapta 
  
  int mid = (left + right) / 2;
  ssm ans; //asta vom returna la final de tot
  ssm valoareleft = solve(left, mid);
  ssm valoareright = solve(mid + 1, right);
  // aici cazul cand secventa se intinde pe ambele parti
  int solutie = 0;
  int suma = 0, maxsum = -INT_MAX, indice_stanga;
  for(int st = mid; st >= left; st--){
    suma += a[st];
    if(suma > maxsum){
      maxsum = suma;
      indice_stanga = st;
    }
  }
  solutie += maxsum;
  maxsum = -INT_MAX;
  suma = 0;
  int indice_dreapta;
  for(int dr = mid + 1; dr <= right; dr++){
    suma += a[dr];
    if(suma > maxsum){
      maxsum = suma;
      indice_dreapta = dr;
    }
  }
  solutie += maxsum;

  if(valoareleft.sum >= valoareright.sum){
    ans = valoareleft;
  }
  else{
    ans = valoareright;
  }
  if(solutie > ans.sum){
    ans = {solutie, indice_stanga, indice_dreapta};
  }
  else if(solutie == ans.sum && (ans.left > indice_stanga || (ans.left == indice_stanga && ans.right > indice_dreapta))){
    ans = {solutie, indice_stanga, indice_dreapta};
  }
  return ans;
}

int main(){
    f >> n;
    for(int i = 1; i <= n; i++){
      f >> a[i];
    }

  ssm solutie = solve(1, n);
  g << solutie.sum << solutie.left << solutie.right;

}