Mai intai trebuie sa te autentifici.
Cod sursa(job #3144409)
Utilizator | Data | 7 august 2023 22:03:58 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.18 kb |
#include <fstream>
#include<iostream>
#include <vector>
#include <algorithm>
#define NMAX 100002
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
std::vector<std::pair<int, int>> V;
std::vector<std::pair<int, int>> tree;
int pred[NMAX];
std::pair<int, int> unite(std::pair<int, int> a, std::pair<int, int> b){
if(a.first > b.first)
return a;
else return b;
}
void update(int node, int left, int right, int pos, int i, int value){
if(left == right){
tree[node] = {value, i};
return ;
}
int mid = left + (right - left) / 2;
if(pos <= mid){
update(2 * node, left, mid, pos, i, value);
}
else{
update(2 * node + 1, mid + 1, right, pos, i, value);
}
tree[node] = unite(tree[node * 2], tree[node * 2 + 1]);
}
std::pair<int, int> query(int node, int left, int right, int L, int R){
if(L <= left && right <= R){
return tree[node];
}
if(L > right || R < left)
return {0, 0};
int mid = left + (right - left)/2;
return unite(
query(node * 2, left, mid, L, R),
query(node * 2 + 1, mid + 1, right, L, R)
);
}
int main(){
int n;
fin >> n;
V = std::vector<std::pair<int, int>> (n + 1);
std::vector<int> arr(n + 1), u(n + 1), result;
tree.resize(4 * n);
for(int x, i = 1; i <= n; i ++){
fin >> x;
V[i].first = x;
V[i].second = i;
u[i] = x;
}
std::sort(V.begin(), V.end());
int x = 0;
for(int i = 1; i <= n; i++){
if(i == 1 || V[i].first != V[i-1].first)
arr[V[i].second] = ++x;
else arr[V[i].second] = x;
}
/*for(int i = 1; i <= n; i++)
std::cout << arr[i] << " ";
std::cout << "\n";
*/
for(int i = 1; i <= n; i++){
std::pair<int, int> Q = query(1, 1, n, 1, arr[i] - 1);
update(1, 1, n, arr[i], i, Q.first + 1);
//std::cout << Q.first << " " << Q.second << "\n";
pred[i] = Q.second;
}
fout << tree[1].first << "\n";
int j = tree[1].second;
while(j != 0){
result.push_back(u[j]);
j = pred[j];
}
for(int i = result.size() - 1; i >= 0; i --){
fout << result[i] << " ";
}
}