Cod sursa(job #1713978)

Utilizator contnouAndrei Pavel contnou Data 7 iunie 2016 00:28:57
Problema Subsecventa de suma maxima Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>

#define MAXN 6000005

using namespace std;

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

subseq best(subseq a, subseq b) {
	//
	if (a.sum > b.sum) {
		return a;
	} else if (a.sum < b.sum) {
		return b;
	} else if (a.left < b.left || (a.left == b.left && a.right < b.right)) {
		return a;
	} else {
		return b;
	}
}
subseq ssm(int* A, int left, int right) {
	//
	if (left == right) {
		subseq s = { left, right, A[left] };
		return s;
	}

	int mid = (left + right) / 2;
	subseq s1 = ssm(A, left, mid);
	subseq s2 = ssm(A, mid + 1, right);

	int leftsum = 0, leftstart = mid;
	int rightsum = 0, rightend = mid;
	for (int sum = 0, i = mid - 1; i >= left; i--) {
		sum += A[i];
		if (sum >= leftsum) {
			leftstart = i;
			leftsum = sum;
		}
	}

	for (int sum = 0, i = mid + 1; i <= right; i++) {
		sum += A[i];
		if (sum >= rightsum) {
			rightend = i;
			rightsum = sum;
		}
	}

	subseq combine = { leftstart, rightend, leftsum + rightsum + A[mid] };
	return best(best(s1, s2), combine);
}

int main() {
	int A[MAXN];
	int n;

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

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

	subseq s = ssm(A, 1, n);
	g << s.sum << " " << s.left << " " << s.right;

	return 0;
}