Cod sursa(job #1655445)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 17 martie 2016 23:31:37
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <numeric>
#include <algorithm>
#include <vector>
using namespace std;

int main(){
	ifstream f("psir.in");
	ofstream g("psir.out");
	int n;
	f >> n;

	vector<int> v(n);
	for(auto& x : v){
		f >> x; }

	vector<vector<unsigned int>> d(n, vector<unsigned int>(n, 1));

	auto cmp = [&](const int a, const int b){
		return v[a] < v[b]; };

	vector<int> left, right(n-1);
	iota(right.begin(), right.end(), 1);
	sort(right.begin(), right.end(), cmp);
	
	for(int mij = 1; mij < n-1; ++mij){
		left.insert(lower_bound(left.begin(), left.end(), mij-1, cmp), mij-1);
		right.erase(find(right.begin(), right.end(), mij));

		unsigned int tmp = 0;
		for(int i = 0, j = 0; i < right.size() && v[right[i]] < v[mij]; ++i){
			while(j < left.size() && v[left[j]] < v[right[i]]){
				tmp += d[left[j]][mij];
				++j; }
			d[mij][right[i]] += tmp; }
		tmp = 0;
		for(int i = right.size()-1, j = left.size()-1; i >= 0 && v[right[i]] > v[mij]; --i){
			while(j >= 0 && v[left[j]] > v[right[i]]){
				tmp += d[left[j]][mij];
				--j; }
			d[mij][right[i]] += tmp; } }

	unsigned int rez = 0;
	for(int i = 0; i < n; ++i){
		for(int j = i+1; j < n; ++j){
			rez += d[i][j]; } }

	g << rez;

	return 0; }