제출 #1364640

#제출 시각아이디문제언어결과실행 시간메모리
1364640njoopTopical (NOI23_topical)C++20
100 / 100
752 ms212472 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, k, ans=0;
    cin >> n >> k;
    vector<pair<vector<int>, vector<int>>> modreq;
    set<int> s;
    vector<int> stat(n+2, 0), cur(k+2, 0);
    vector<priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>> upd;
    upd.assign(k+2, priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>());
    for(int i=0; i<n; i++) {
        vector<int> v;
        s.insert(i);
        for(int j=1; j<=k; j++) {
            int in;
            cin >> in;
            if(j == 1) upd[0].push({in, i});
            v.push_back(in);
        }
        modreq.push_back({v, {}});
    }
    for(int i=0; i<n; i++) {
        vector<int> v;
        for(int j=1; j<=k; j++) {
            int in;
            cin >> in;
            v.push_back(in);
        }
        modreq[i].second = v;
    }
    queue<int> ord;
    for(int i=0; i<k; i++) {
        while(!upd[i].empty()) {
            auto [req, idx] = upd[i].top();
            if(cur[i] >= req) {
                upd[i].pop();
                if(i+1 == k) {
                    upd[i+1].push({0, idx});
                    ord.push(idx);
                } else upd[i+1].push({modreq[idx].first[i+1], idx});
            } else break;
        }
    }
    while(!ord.empty()) {
        int cn = ord.front();
        ord.pop();
        for(int i=0; i<k; i++) cur[i] += modreq[cn].second[i]; 
        for(int i=0; i<k; i++) {
            while(!upd[i].empty()) {
                auto [req, idx] = upd[i].top();
                if(cur[i] >= req) {
                    upd[i].pop();
                    if(i+1 == k) {
                        upd[i+1].push({0, idx});
                        ord.push(idx);
                    } else upd[i+1].push({modreq[idx].first[i+1], idx});
                } else break;
            }
        }
    }
    cout << upd[k].size();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…