제출 #1290382

#제출 시각아이디문제언어결과실행 시간메모리
1290382leehoangTopical (NOI23_topical)C++20
100 / 100
363 ms190028 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define pb push_back #define ii pair<int,int> #define int long long #define TASK "tropical" const int maxn = 1e6+5; const int mod = 1e9+7; int n,k; vector<vector<int>> r,u; vector<int> p; namespace trau{ vector<int> d; void solve(){ d.assign(n+5,0); int res = 0; while (1){ bool ok = 0; for (int i = 1;i<=n;i++){ int cnt = 0; if (!d[i]){ for (int j = 1;j<=k;j++){ if (p[j]>=r[i][j]) cnt++; } if (cnt == k){ ok = 1; for (int j = 1;j<=k;j++){ p[j]+=u[i][j]; } res++; d[i] = 1; } } } if (!ok) break; } cout << res; } } namespace sub3{ vector<ii> a; void solve(){ for (int i = 1;i<=n;i++) a.pb({r[i][1],u[i][1]}); sort(a.begin(),a.end()); int l = 0; int cnt = 0; int cur = 0; for (int i = 0;i<n;i++){ if (a[i].fi <= cur){ cur+=a[i].se; cnt++; } else break; } cout << cnt; } } namespace subac{ vector<int> cnt; vector<vector<ii>> s; vector<int> t; void solve(){ cnt.assign(n+5,0); s.resize(k+5); t.assign(k+5,0); int res = 0; queue<int> q; for (int i = 1;i<=n;i++){ for (int j = 1;j<=k;j++){ s[j].pb({r[i][j],i}); if (r[i][j]<=p[j]) cnt[i]++; } if (cnt[i] == k){ q.push(i); } } for (int j = 1;j<=k;j++) { sort(s[j].begin(),s[j].end()); while (t[j]<n && s[j][t[j]].fi<=p[j]) { t[j]++; } } while (q.size()){ int idx = q.front(); // cout << idx << " "; q.pop(); res++; for (int i = 1;i<=k;i++){ p[i]+= u[idx][i]; } for (int i = 1;i<=k;i++){ while (t[i]<n && s[i][t[i]].fi<=p[i]){ cnt[s[i][t[i]].se]++; if (cnt[s[i][t[i]].se]==k){ q.push(s[i][t[i]].se); } t[i]++; } } } cout << res; } } signed main(){ ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0); if (fopen(TASK".inp","r")){ freopen(TASK".inp","r",stdin); freopen(TASK".out","w",stdout); } cin >> n >> k; r.assign(n+5,vector<int>(k+5,0)); u.assign(n+5,vector<int>(k+5,0)); p.assign(k+5,0); for (int i = 1;i<=n;i++){ for (int j = 1;j<=k;j++) cin >> r[i][j]; } for (int i = 1;i<=n;i++){ for (int j = 1;j<=k;j++) cin >> u[i][j]; } if (k==1) sub3::solve(); else if (n<=100 && k<=100){ trau::solve(); } else subac::solve(); // trau::solve(); // sub3::solve(); }

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:110:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |         freopen(TASK".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:111:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |         freopen(TASK".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...