Cod sursa(job #1412977)

Utilizator BlueStrutAndrei Prahoveanu BlueStrut Data 1 aprilie 2015 17:58:55
Problema Peste Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
pair<int,int> a[500001];
int i, n, tt, k, nav[500001];
long long mx, sol[500001];
inline void citeste(){
    int st, dr, mij, poz, optim[500001], cntr;
    scanf("%d%d%d", &n, &k, &tt);
    for (i=1;i<=n;i++) scanf("%d%d", &a[i].second, &a[i].first);
    sort(a+1, a+n+1); nav[0]=0;
    for (i=1;i<=k;i++) {
        nav[i]=nav[i-1]+a[i].second; optim[i]=a[i].second;
    }
    if (k<n) sort(optim+1, optim+k+1);
    for (i=k+1;i<=n;i++) {
        nav[i]=nav[i-1];
        if (a[i].second<=optim[1]) continue;
        if (a[i].second>=optim[k]) poz=k; else
        while (st<=dr) {
            mij=st+(dr-st)/2;
            if (optim[mij]==a[i].second) {poz=mij; break;}
            if (optim[mij]>a[i].second) dr=mij-1;
                else {poz=mij; st=mij+1;}
        }
        nav[i]+=(a[i].second-optim[1]);
        for (cntr=1;cntr<poz;cntr++) optim[cntr]=optim[cntr+1];
        optim[cntr]=a[i].second;
    }
}
inline void rez(){
    bool ok=true;
    vector<int> cd;
    vector<int>::iterator it;
    stack<int> st;
    cd.push_back(0);
    while (ok){
        ok=false;
        ///pentru plasa i
        ///timp=a[i].first
        ///cantitate=nav[i]
        for (it=cd.begin();it!=cd.end();it++) {
            for (i=1;i<=n;i++)
            if (*it+a[i].first<=tt)
            if ((sol[*it+a[i].first]==0)||(sol[*it+a[i].first]<sol[*it]+nav[i])) {
                ok=true;
                if (sol[*it+a[i].first]==0) st.push(*it+a[i].first);
                sol[*it+a[i].first]=sol[*it]+nav[i];
                if (mx<sol[*it+a[i].first]) mx=sol[*it+a[i].first];
            }
        }
        while (!st.empty()) {cd.push_back(st.top()); st.pop();}
    }
}
int main(){
    freopen("peste.in","r",stdin);
    freopen("peste.out","w",stdout);
    citeste(); rez();
    printf("%lld\n", mx);
    return 0;
}