제출 #898012

#제출 시각아이디문제언어결과실행 시간메모리
898012vlnt32Cloud Computing (CEOI18_clo)C++14
100 / 100
1382 ms25760 KiB
#include <bits/stdc++.h>
#define problem "test"
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define ALL(v) (v).begin(),(v).end()
#define UNIQUE(v) (v).resize(unique(ALL(v)) - (v).begin())
#define BIT(x,i) (((x) >> (i)) & 1)
#define MASK(i) (1LL << (i))
using namespace std;
const int N = 2000;

template<class X,class Y>
    bool maximize(X &x,Y y){
        if (x < y){
            x = y;    return true;
        }
        return false;
    }

template<class X,class Y>
    bool minimize(X &x,Y y){
        if (x > y){
            x = y;    return true;
        }
        return false;
    }

struct State{
    ll c,f,v;
    State (ll _c = 0,ll _f = 0,ll _v = 0){
        c = _c, f = _f, v = _v;
    }
    void input(){
        cin>>c>>f>>v;
    }
    bool operator < (const State &other) const{
        return f > other.f;
    }
};

int n,m;
State cpt[N + 5],person[N + 5];
ll maxCore,maxF;

namespace subtask1{
    const int nMax = 15;
    const int sMax = 750;
    ll dp[2][N + 5][sMax + 5],oo;

    void process(){
        int sumMax = 0;
        for (int i=1;i<= n;i++ )
            sumMax += cpt[i].c;
        memset(dp,-0x3f,sizeof(dp));
        oo = dp[0][0][0];
        dp[0][0][0] = 0;
        for (int i=0;i<= n;i++ ){
            memset(dp[(i + 1) & 1],-0x3f,sizeof(dp[(i + 1) & 1]));
            for (int j=0;j<= m;j++ )
                for (int cnt=0;cnt<= sumMax;cnt++ )
                    if (dp[i & 1][j][cnt] != oo){
                        if (j < m && person[j + 1].f <= cpt[i].f && person[j + 1].c <= cnt)
                            maximize(dp[i & 1][j + 1][cnt - person[j + 1].c],dp[i & 1][j][cnt] + person[j + 1].v);
                        if (i < n && cnt + cpt[i + 1].c <= sumMax)
                            maximize(dp[(i + 1) & 1][j][cnt + cpt[i + 1].c],dp[i & 1][j][cnt] - cpt[i + 1].v);
                        maximize(dp[(i + 1) & 1][j][cnt],dp[i & 1][j][cnt]);
                        maximize(dp[i & 1][j + 1][cnt],dp[i & 1][j][cnt]);
                        maximize(dp[(i + 1) & 1][j + 1][cnt],dp[i & 1][j][cnt]);
                    }
        }
        ll res = oo;
        for (int cnt=0;cnt<= sumMax;cnt++ )
            maximize(res,dp[n & 1][m][cnt]);
        cout<<res;
    }
};

namespace subtask2{
    const int nMax = 15;
    const int sMax = 750;
    ll dp[2][nMax + 5][sMax + 5],oo;

    void process(){
        int sumMax = 0;
        for (int i=1;i<= n;i++ )
            sumMax += person[i].c;
        memset(dp,-0x3f,sizeof(dp));
        oo = dp[0][0][0];
        dp[0][0][0] = 0;
        for (int i=0;i<= n;i++ ){
            memset(dp[(i + 1) & 1],-0x3f,sizeof(dp[(i + 1) & 1]));
            for (int j=0;j<= m;j++ )
                for (int cnt=0;cnt<= sumMax;cnt++ )
                    if (dp[i & 1][j][cnt] != oo){
                        if (j < m && person[j + 1].f <= cpt[i].f && person[j + 1].c <= cnt)
                            maximize(dp[i & 1][j + 1][cnt - person[j + 1].c],dp[i & 1][j][cnt] + person[j + 1].v);
                        if (i < n){
                            int newCnt = (cnt + cpt[i + 1].c >= sumMax ? sumMax : cnt + cpt[i + 1].c);
                            maximize(dp[(i + 1) & 1][j][newCnt],dp[i & 1][j][cnt] - cpt[i + 1].v);
                        }
                        maximize(dp[(i + 1) & 1][j][cnt],dp[i & 1][j][cnt]);
                        maximize(dp[i & 1][j + 1][cnt],dp[i & 1][j][cnt]);
                        maximize(dp[(i + 1) & 1][j + 1][cnt],dp[i & 1][j][cnt]);
                    }
        }
        ll res = oo;
        for (int cnt=0;cnt<= sumMax;cnt++ )
            maximize(res,dp[n & 1][m][cnt]);
        cout<<res;
    }
};

namespace subtask3{
    const int nMax = 2000;
    ll dp[nMax + 5][nMax + 5],oo;

    void process(){
        for (int i=1;i<= n;i++ )
            for (int j=1;j<= m;j++ ){
                dp[i][j] = max({dp[i][j - 1],dp[i - 1][j],dp[i - 1][j - 1]});
                if (cpt[i].f >= person[j].f)
                    dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + person[j].v - cpt[i].v);
            }

        cout<<dp[n][m];
    }
}

namespace subtask4{
    const int sumMax = 1e5;

    ll maxValue[sumMax + 5],minCost[sumMax + 5],oo;

    void process(){
        int sumCpt = 0;
        for (int i=1;i<= n;i++ )
            sumCpt += cpt[i].c;
        memset(minCost,0x3f,sizeof(minCost));
        minCost[0] = 0;

        for (int i=1;i<= n;i++ )
            for (int cnt=sumCpt;cnt>= cpt[i].c;cnt-- )
                minimize(minCost[cnt],minCost[cnt - cpt[i].c]  + cpt[i].v);

        int sumPer = 0;
        for (int i=1;i<= m;i++ )
            sumPer += person[i].c;
        memset(maxValue,-0x3f,sizeof(maxValue));
        oo = maxValue[0];
        maxValue[0] = 0;

        for (int i=1;i<= m;i++ )
            for (int cnt=sumPer;cnt>= person[i].c;cnt-- )
                maximize(maxValue[cnt],maxValue[cnt - person[i].c] + person[i].v);

        for (int i=sumCpt;i>= 0;i-- )
            minimize(minCost[i],minCost[i + 1]);

        ll res = 0;

        for (int i=0;i<= min(sumCpt,sumPer);i++ )
            if (maxValue[i] != oo)
                res = max(res,maxValue[i] - minCost[i]);

        cout<<res;
    }
};

namespace subtask6{
    const int nMax = 2000;
    const int cMax = 100;
    ll dp[2][nMax + 5][cMax + 5],oo;

    void process(){
        memset(dp,-0x3f,sizeof(dp));
        oo = dp[0][0][0];
        dp[0][0][0] = 0;
        for (int i=0;i<= n;i++ ){
            memset(dp[(i + 1) & 1],-0x3f,sizeof(dp[(i + 1) & 1]));
            for (int j=0;j<= m;j++ )
                for (int cnt=0;cnt<= 100;cnt++ )
                    if (dp[i & 1][j][cnt] != oo){
                        if (j < m && person[j + 1].f <= cpt[i].f && person[j + 1].c <= cnt)
                            maximize(dp[i & 1][j + 1][cnt - person[j + 1].c],dp[i & 1][j][cnt] + person[j + 1].v);
                        if (i < n && cnt + cpt[i + 1].c <= cMax){
                            int newCnt = (cnt + cpt[i + 1].c);
                            maximize(dp[(i + 1) & 1][j][newCnt],dp[i & 1][j][cnt] - cpt[i + 1].v);
                        }
                        maximize(dp[(i + 1) & 1][j][cnt],dp[i & 1][j][cnt]);
                        maximize(dp[i & 1][j + 1][cnt],dp[i & 1][j][cnt]);
                        // maximize(dp[(i + 1) & 1][j + 1][cnt],dp[i & 1][j][cnt]);
                    }
        }
        ll res = 0;
        for (int cnt=0;cnt<= 100;cnt++ )
            maximize(res,dp[n & 1][m][cnt]);
        cout<<res;
    }
};

int main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);    cout.tie(NULL);
    cin>>n;
    for (int i=1;i<= n;i++ ){
        cpt[i].input();
        maxCore = max(maxCore,cpt[i].c);
        maxF = max(maxF,cpt[i].f);
    }
    cin>>m;
    for (int i=1;i<= m;i++ ){
        person[i].input();
        maxCore = max(maxCore,person[i].c);
        maxF = max(maxF,person[i].f);
    }

    sort(cpt + 1,cpt + n + 1);
    sort(person + 1,person + m + 1);

    if (n <= 15)
        subtask1 :: process();
    else if (m <= 15)
        subtask2 :: process();
    else if (maxCore == 1)
        subtask3 :: process();
    else if (maxF == 1)
        subtask4 :: process();
    else subtask6 :: process();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...