Submission #1369611

#TimeUsernameProblemLanguageResultExecution timeMemory
1369611pcheloveksScarecrows 2 (JOI26_scarecrows)C++20
11 / 100
2603 ms1114112 KiB
#define _CRT_SECURE_NO_WARNINGS
 
#include <bits/stdc++.h>
 
#define endl '\n'
 
#pragma GCC optimize("Ofast")
 
using namespace std;
 
using ll = long long;
using ld = long double;
using pii = pair < int, int >;
using pll = pair < ll, ll >;
 
const ll INF = 2e18;
const ll DIM = 400007;
const ll DIMQ = 2007;
const ld PI = 3.1415926535;
const int mod = 998244353;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
#ifdef IloveCP
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif  

    int n, k;
    cin >> n >> k;

    vector < vector < pll > > a(4);
    vector < ll > c(n);

    for(int i = 0; i < n; i++) {
        ll t, x, y;
        cin >> t >> x >> y >> c[i];
        t--;

        if(t < 2) a[t].push_back({x, i});
        else a[t].push_back({y, i});
    }

    vector < vector < ll > > x(a[0].size() + a[2].size(), vector < ll >(a[1].size() + a[3].size(), INF));

    for(int t = 0; t < 4; t++) {
        sort(a[t].begin(), a[t].end());
    }

    for(int i = 0; i < a[0].size(); i++) {
        for(int j = 0; j < a[1].size(); j++) {
            if(a[0][i].first >= a[1][j].first) {
                x[i][j] = c[a[0][i].second] + c[a[1][j].second];
            } 
        }
    }

    for(int i = 0; i < a[2].size(); i++) {
        for(int j = 0; j < a[3].size(); j++) {
            if(a[2][i].first >= a[3][j].first) {
                x[i + a[0].size()][j + a[1].size()] = c[a[2][i].second] + c[a[3][j].second];
            } 
        }
    }

    vector < vector < ll > > curr = x;

    while(k > 1) {
        vector < vector < ll > > mi = curr;
        for(int i = 0; i < mi.size(); i++) {
            for(int j = 0; j < mi[i].size(); j++) {
                if(i != 0) mi[i][j] = min(mi[i][j], mi[i - 1][j]);
                if(j != 0) mi[i][j] = min(mi[i][j], mi[i][j - 1]);
            }
        }

        for(int i = 0; i < curr.size(); i++) {
            for(int j = 0; j < curr[i].size(); j++) {
                if(i == 0 || j == 0) {
                    curr[i][j] = INF;
                    continue;
                }

                curr[i][j] = mi[i - 1][j - 1] + x[i][j];
                curr[i][j] = min(curr[i][j], INF);

            }
        }
        k--;


    }

    ll res = INF;
    for(int i = 0; i < curr.size(); i++) {
        for(int j = 0; j < curr[i].size(); j++) {
            res = min(res, curr[i][j]);
        }
    }
    cout << (res == INF ? -1 : res) << endl;

    return 0;
}
#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...