Submission #1304101

#TimeUsernameProblemLanguageResultExecution timeMemory
1304101WarinchaiCloud Computing (CEOI18_clo)C++20
100 / 100
395 ms1488 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;

int dp[100005];
int inf=1e15;
vector<pair<int,int>>have[2005];

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    vector<int>val;
    vector<pair<int,pair<int,int>>>temp;
    vector<pair<int,pair<int,int>>>buy;
    for(int i=1;i<=n;i++){
        int c,f,v;cin>>c>>f>>v;
        val.push_back(f);
        temp.push_back({f,{-v,c}});
    }
    sort(val.begin(),val.end());
    val.erase(unique(val.begin(),val.end()),val.end());
    for(auto x:temp){
        int f=x.first;
        auto v=x.second;
        int id=lower_bound(val.begin(),val.end(),f)-val.begin();
        have[id].push_back(v);
    }
    int m;cin>>m;
    for(int i=1;i<=m;i++){
        int c,f,v;cin>>c>>f>>v;
        buy.push_back({f,{v,-c}});
    }
    sort(buy.begin(),buy.end());
    reverse(buy.begin(),buy.end());
    int cur=0;
    for(int i=1;i<=1e5;i++)dp[i]=-inf;
    for(int i=val.size()-1;i>=0;i--){
        int f=val[i];
        for(;cur<m&&buy[cur].first>f;cur++){
            //cerr<<buy[cur].first<<"\n";
            int cost=buy[cur].second.first;
            int num=buy[cur].second.second;
            //cerr<<"item:"<<cost<<" "<<num<<"\n";
            for(int i=0;i<=1e5;i++){
                if(i-num>1e5)break;
                dp[i]=max(dp[i],dp[i-num]+cost);
            }
        }
        for(auto [cost,num]:have[i]){
            //cerr<<"item:"<<cost<<" "<<num<<"\n";
            for(int i=1e5;i>=0;i--){
                if(i-num<0)break;
                dp[i]=max(dp[i],dp[i-num]+cost);
            }
        }
        //cerr<<"f:"<<f<<"\n";
    }
    for(;cur<m;cur++){
        //cerr<<buy[cur].first<<"\n";
        int cost=buy[cur].second.first;
        int num=buy[cur].second.second;
        //cerr<<"item:"<<cost<<" "<<num<<"\n";
        for(int i=0;i<=1e5;i++){
            if(i-num>1e5)break;
            dp[i]=max(dp[i],dp[i-num]+cost);
        }
    }
    int ans=0;
    for(int i=0;i<=1e5;i++)ans=max(ans,dp[i]);
    cout<<ans<<"\n";
}
#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...