Pagini recente » Cod sursa (job #1318554) | Diferente pentru problema/makebipartite intre reviziile 2 si 3 | Cod sursa (job #2744352) | Cod sursa (job #2076342) | Cod sursa (job #3308705)
#include <fstream>
using namespace std;
const int Nmax = 100005;
int n, v[Nmax], dp[Nmax], minVal[Nmax], len;
// dp[i] = lungimea scmax care se termina pe pozitia i
// minVal[l] = valoarea minima a unei secvente crescatoare de lungime l
int binSearch(int val){
int st = 1, dr = len;
while(st != dr){
int mij = (st + dr) / 2;
if(minVal[mij] <= val){
st = mij+1;
}
else{
dr = mij;
}
}
if(val > minVal[st]){
return st+1;
}
return st;
}
int main(){
ifstream fin("scamx.in");
ofstream fout("scmax.out");
fin >> n;
for(int i = 1; i <= n; i++){
fin >> v[i];
}
dp[1] = 1;
minVal[1] = v[1];
len = 1; // lungimea lui minVal
for(int i = 2; i <= n; i++){
int pos = binSearch(v[i]);
minVal[pos] = v[i];
if(pos > len){
len++;
}
dp[i] = pos;
}
fout << len << "\n";
for(int i = 1; i <= len; i++){
fout << minVal[i] << " ";
}
return 0;
}