Cod sursa(job #2233495)

Utilizator rares.amarandeiRares Amarandei rares.amarandei Data 23 august 2018 14:48:32
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb

#include <stdint.h>
#include <string>
#include <vector>
#include <iostream>
#include <unordered_map>
#include <memory>
#include <algorithm>
#include <deque>
#include <iterator>
#include <numeric>
#include <assert.h>
#include <limits>
#include <queue>
#include <fstream>

using namespace std;

vector<int> runAlgorithm(const vector<int> input)
{
    auto higherCandidate = [](vector<int> left, vector<int> right) {
      return left.size() < right.size();
    };
    priority_queue<vector<int>, vector<vector<int>>, decltype(higherCandidate) > outputCandidates(higherCandidate);
    outputCandidates.push(vector<int>{ input.front() });
    for_each(input.begin(), input.end(), [&](const int val) {
      vector<vector<int>> putBackInQueue;
      int updatedCandidates = 0;
      while (!outputCandidates.empty()) 
      {
        auto candidate = outputCandidates.top();
        outputCandidates.pop();
        if (candidate.back() < val) 
        {
          candidate.push_back(val);
          ++updatedCandidates;
        }
        else
        {
          vector<int> temp = candidate;
          while (!temp.empty() && temp.back() >= val)
          {
            temp.pop_back();
          }
          temp.push_back(val);
          putBackInQueue.push_back(temp);
        }
        if (updatedCandidates <= 1)
        {
          putBackInQueue.push_back(candidate);
        }
      }

      for (auto candidate : putBackInQueue) {
        outputCandidates.push(candidate);
      }
    });

    return outputCandidates.top();
  }

int main() {
  ifstream f("scmax.in");
  ofstream g("scmax.out");
  vector<int> input;
  vector<int> output;
  int n = 0;
  f >> n;
  int x = 0;
  for (int i = 0; i<n; i++)
  {
    f >> x;
    input.push_back(x);
  }
  output = runAlgorithm(input);
  g << output.size() << '\n';
  for (auto it = output.begin(); it != output.end(); ++it)
  {
    g << *it << ' ';
  }
  return 0;
}