Cod sursa(job #2080601)

Utilizator ioana_marinescuMarinescu Ioana ioana_marinescu Data 3 decembrie 2017 12:42:10
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
const int NMAX = 4005;
using namespace std;
ifstream fin("cuburi3.in");
ofstream fout("cuburi3.out");

int n, indice[NMAX], lungime, solutie[NMAX], indice_anterior[NMAX];
struct cub {
    int l, g, poz;
}a[NMAX];

inline bool cmp(const cub &x, const cub &y) {
    if(x.g==y.g)
        return x.l>y.l;
    return x.g>y.g;
}

int bs(int i) {
    int st=1, dr=lungime, mij, sol=0;
    while(st<=dr) {
        mij=(st+dr)>>1;
        if(a[i].l<=a[indice[mij]].l) {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    return sol+1;
}

void dinamica() {
    lungime=1;
    indice[1]=1;
    for(int i=2; i<=n; i++) {
        if(a[i].l<=a[indice[lungime]].l) {
            lungime++;
            indice[lungime]=i;
            indice_anterior[i]=indice[lungime-1];
        }
        else {
            int pozitie=bs(i);
            //if(pozitie!=1)
            indice[pozitie]=i;
            indice_anterior[i]=indice[pozitie-1];
        }
    }
}

int main() {
    int i, inaltime=0;
    fin>>n;
    for(i=1; i<=n; i++) {
        fin>>a[i].l>>a[i].g;
        a[i].poz=i;
    }
    sort(a+1, a+n+1, cmp);
    dinamica();
    int pozitie=lungime;
    i=indice[lungime];
    while(i>0)
    {
        solutie[pozitie]=a[i].poz;
        inaltime+=a[i].l;
        i=indice_anterior[i];
        pozitie--;
    }

    fout<<lungime<<" "<<inaltime<<'\n';
    for(i=1; i<=lungime; i++)
        fout<<solutie[i]<<'\n';
    return 0;
}