제출 #1005523

#제출 시각아이디문제언어결과실행 시간메모리
1005523vjudge1Topical (NOI23_topical)C++17
100 / 100
555 ms146456 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { int n, k; cin >> n >> k; vector<vector<ll>> r(n, vector<ll>(k)), u(n, vector<ll>(k)); vector<vector<pair<ll, int>>> P(k); int ans = 0; queue<int> q; vector<ll> sum(k); vector<int> cnt(n), pt(k); vector<bool> vis(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < k; ++j) { cin >> r[i][j]; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < k; ++j) { cin >> u[i][j]; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < k; ++j) { P[j].push_back(make_pair(r[i][j], i)); } } for (int i = 0; i < k; ++i) { sort(P[i].begin(), P[i].end()); } int rt = -1; for (int i = 0; i < n; ++i) { bool al = true; for (int j = 0; j < k; ++j) { if (r[i][j] > 0) { al = false; break; } } if (al) { rt = i; break; } } if (rt == -1) { cout << "0" << "\n"; return 0; } q.push(rt); while (!q.empty()) { int nw = q.front(); q.pop(); if (vis[nw]) continue; vis[nw] = true; ans++; for (int j = 0; j < k; ++j) { sum[j] += u[nw][j]; while (pt[j] < n && P[j][pt[j]].first <= sum[j]) { if (++cnt[P[j][pt[j]].second] == k) { q.push(P[j][pt[j]].second); } pt[j]++; } } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...