Submission #1327945

#TimeUsernameProblemLanguageResultExecution timeMemory
1327945dang_minh_ducTopical (NOI23_topical)C++20
61 / 100
1096 ms126488 KiB
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define fi first
#define se second
#define unmap unordered_map
#define unset unordered_set
#define double long double
using namespace std;
const int dx[4]{-1, 0, 1, 0}, dy[4]{0, 1, 0, -1}; //0: Up  1: Right  2: Down  3: Left
template<class X, class Y>
    bool maximize(X &x, const Y &y) {
        if (x < y) {
            x = y;
            return true;
        }
        return false;
    }
template<class X, class Y>
    bool minimize(X &x, const Y &y) {
         if (x > y) {
            x = y;
            return true;
         }
         return false;
    }
template<class X, class Y>
    void setvaluable(X &x, const Y &y) {
        if (x==-1 || x > y) x = y;
    }

int n, k;
vector<vector<int>>a, u;
void sub1() {
    bool ok=true;
    for (int i=0;i<k;i++) {
        if (a[0][i]) {ok=false;break;}
    }
    cout << ok;
}
set<int>reach, can;
vector<int>cur, dele;
int cnt;
void sub2() {
    cur.resize(k, 0);
    for (int i=0;i<n;i++) reach.insert(i);
    while (!reach.empty()) {
        can.clear();
        dele.clear();
        for (int i:reach) can.insert(i);
        for (int i:can) {
            bool ok=true;
            for (int j=0;j<k;j++) {
                if (cur[j]<a[i][j]) {ok=false;break;}
            }
            if (!ok) dele.push_back(i);
        }
        for (int i:dele) can.erase(i);
        if (can.empty()) break;
        dele.clear();
        for (int i:can) {
            cnt++;
            for (int j=0;j<k;j++) cur[j]+=u[i][j];
            dele.push_back(i);
        }
        for (int i:dele) reach.erase(i);
    }
    cout << cnt;
}
vector<pair<int,int>>b;
int curr;
void sub3() {
    for (int i=0;i<n;i++) b.push_back({a[i][0], i});
    sort(b.begin(), b.end());
    for (int i=0;i<n;i++) {
        if (curr<b[i].fi) break;
        curr+=u[b[i].se][0];
        cnt++;
    }
    cout << cnt;
}
void solve()
{
    cin >> n >> k;
    a.resize(n, vector<int>(k, 0));
    u.resize(n, vector<int>(k, 0));
    for (int i=0;i<n;i++) {
        for (int j=0;j<k;j++) cin >> a[i][j];
    }
    for (int i=0;i<n;i++) {
        for (int j=0;j<k;j++) cin >> u[i][j];
    }
    if (n==1) sub1();
    else if (k==1) sub3();
    else sub2();
}
signed main() {
    //ios_base::sync_with_stdio(false);cin.tie(0);
    int numtest=1; //cin >> numtest;
    while (numtest--) {solve();}
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...