제출 #1327052

#제출 시각아이디문제언어결과실행 시간메모리
1327052yeulerTopical (NOI23_topical)C++20
100 / 100
370 ms136400 KiB
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define eb push_back
#define fi first
#define se second
#define vector2d(x) vector<vector<x>>
#define pii pair<int, int>
#define pl pair<ll, ll>
#define kagamine_len ios_base::sync_with_stdio(0); cin.tie(0);
#define file_in freopen("input.txt", "r", stdin);
#define file_out freopen("output.txt", "w", stdout);
#define all(x) x.begin()+1, x.end()

using namespace std;

/*

g++ -std=c++20 NOI23_Topical.cpp -o output/NOI23_Topical.exe
./output/NOI23_Topical.exe


Input
n -> modules, k -> topics
r1,1, ... r1,k
v       -> untuk modul _ perlu knowledge brp di topic _
rn,1, rn,k
u1,1, ... u1,k
v       -> knowledge yg didapatkan stlh selesai modul _ untuk topic _
un,1, un,k


*/

ll n, k;

void solve(){
    vector r(n+1, vector<ll>(k+1)),
    u(n+1, vector<ll>(k+1));
    vector lr(k+1, vector<pl>(1));
    vector<ll> lst(k+1, 1), rem(n+1, k), cur(k+1, 0);
    ll ans = 0;

    queue<ll> q;

    for (ll i = 1; i <= n; i++){
        bool iya = 1;
        for (ll j = 1; j <= k; j++){
            cin >> r[i][j];
            if (r[i][j] != 0) iya = 0;
            else {
                lst[j]++;
                rem[i]--;
            }
            lr[j].pb({r[i][j], i});
        }
        if (iya){
            q.push(i);
        }
    }
    for (ll i = 1; i <= n; i++){
        for (ll j = 1; j <= k; j++){
            cin >> u[i][j];
        }
    }
    for (ll i = 1; i <= k; i++){
        sort(all(lr[i]));
    }

    while (!q.empty()){
        ll i = q.front();
        ans++;
        q.pop();
        for (ll j = 1; j <= k; j++){
            cur[j] += u[i][j];

            while (lst[j] <= n && lr[j][lst[j]].fi <= cur[j]){
                pl rn = lr[j][lst[j]];
                rem[rn.se]--;
                if (rem[rn.se] == 0){
                    q.push(rn.se);
                }
                lst[j]++;
            }
        }
    }

    cout << ans << "\n";
}


int main(){
    kagamine_len

    cin >> n >> k;

    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...