Cod sursa(job #1334431)

Utilizator atoaderAlexandru Toader atoader Data 4 februarie 2015 13:20:42
Problema Subsecventa de suma maxima Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <vector>
#include <numeric>

using namespace std;
void read(vector<int>& out_data){
	ifstream f("ssm.in");
	int N, x;
	f >> N;
	for (int i = 0; i < N; i++){		
		f >> x;
		out_data.push_back(x);
	}

	f.close();
}

void write(int maxSum, int minIdx, int maxIdx){
	ofstream g("ssm.out");
	g << maxSum << " " << minIdx << " " << maxIdx << std::endl;
	g.close();
}

pair<int, pair<int, int> > findMaxCrossingSequence(const vector<int>& data, int low, int mid, int high){
	int left_sum = data[mid];
	int max_left = mid;

	int sum = 0;
	for (int i = mid; i >= low; --i){
		sum += data[i];
		if (sum > left_sum){
			left_sum = sum;
			max_left = i;
		}
	}

	int right_sum = data[mid + 1];
	int max_right = mid + 1;
	sum = 0;
	for (int i = mid + 1; i <= high; i++){
		sum += data[i];
		if (sum > right_sum){
			right_sum = sum;
			max_right = i;
		}
	}

	return make_pair(left_sum + right_sum, make_pair(max_left, max_right));
}

pair<int, pair<int, int> >  findMax(const vector<int>&data, int low, int high){
	if (low == high){
		return make_pair(data[low], make_pair(low, high));
	}
	else{
		int mid = (low + high) / 2;
		pair<int, pair<int, int> > left = findMax(data, low, mid);
		pair<int, pair<int, int> > right = findMax(data, mid + 1, high);
		pair<int, pair<int, int> > center = findMaxCrossingSequence(data, low, mid, high);
		if (left.first > right.first && left.first > center.first){
			return left;
		}
		else if (right.first > left.first && right.first > center.first){
			return right;
		}
		else{
			return center;
		}
	}
}


int main(){
	vector<int> data;	
	
	read(data);

	pair<int, pair<int, int> >  result = findMax(data, 0, data.size() - 1);

	write(result.first, result.second.first+1, result.second.second+1);

	return 0;
}