Submission #1370673

#TimeUsernameProblemLanguageResultExecution timeMemory
1370673brintonScarecrows 2 (JOI26_scarecrows)C++20
11 / 100
34 ms1416 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define inf (long long)(1e15)
signed main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //start here
    int N,k;cin >> N >> k;
    vector<vector<pair<int,int>>> loc(5);
    for(int i = 1;i <= N;i++){
        int t,x,y,c;
        cin >> t >> x >> y >> c;
        c++;
        if(t <= 2) loc[t].push_back({x,c});
        else loc[t].push_back({y,c});
    }

    auto solve = [&](vector<pair<int,int>> right,vector<pair<int,int>> left){
        sort(left.begin(),left.end());
        sort(right.begin(),right.end());
        vector<pair<int,int>> arr;
        for(auto [loc,cost]:left){
            int nloc = lower_bound(right.begin(),right.end(),pair<int,int>{loc+2,-1LL})-right.begin();
            arr.push_back({nloc,-cost});
        }
        for(int i = 0;i < right.size();i++){
            auto [loc,cost] = right[i];
            arr.push_back({i,cost});
        }
        sort(arr.begin(),arr.end());

        vector<vector<int>> dp(k+1,vector<int>(k+1,inf));
        dp[0][0] = 0;
        for(auto [loc,cost]:arr){
            // cout << "??" << loc << " " << cost << endl;
            vector<vector<int>> ndp = dp;
            if(cost > 0){
                for(int i = 0;i+1 <= k;i++){
                    for(int j = 0;j <= i;j++){
                        ndp[i+1][j] = min(ndp[i+1][j],dp[i][j]+abs(cost));
                    }
                }
            }else{
                for(int i = 0;i <= k;i++){
                    for(int j = 0;j+1 <= i;j++){
                        ndp[i][j+1] = min(ndp[i][j+1],dp[i][j]+abs(cost));
                    }
                }
            }

            swap(dp,ndp);
        }
        vector<int> ret(k+1);
        for(int i = 0;i <= k;i++) ret[i] = dp[i][i];
        return ret;
    };

    vector<int> ans1 = solve(loc[2],loc[1]);
    vector<int> ans2 = solve(loc[4],loc[3]);
    int ans = inf;
    
    
    for(int i = 0;i <= k;i++){
        ans = min(ans,ans1[i]+ans2[k-i]);
    }
    // for(auto &i:ans1) cout << i << " ";cout << endl;
    // for(auto &i:ans2) cout << i << " ";cout << endl;
    if(ans < inf){
        cout << ans-2*k;
    }else{
        cout << "-1\n";
    }
    // cout << max(solve(loc[2],loc[1]),solve(loc[4],loc[3]));
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...