Submission #1299900

#TimeUsernameProblemLanguageResultExecution timeMemory
1299900danglayloi1Topical (NOI23_topical)C++20
100 / 100
565 ms70740 KiB
#include <bits/stdc++.h> #define ii pair<int, int> #define fi first #define se second #define inf 0x3f3f3f3f using namespace std; using ll = long long; const ll mod=1e9+7; const int nx=1e6+5; int n, m, cnt[nx], a[nx], b[nx], leaf[nx], res=0; ll cur[nx]; vector<ii> ve[nx]; int rar(int x, int y) { return x*m+y; } ii pos(int x) { return {x/m, x%m}; } ii nod[nx<<2]; void build(int id, int l, int r) { if(l==r) { leaf[l]=id; nod[id]={cnt[l], l}; return; } int mid=(l+r)>>1; build(id<<1, l, mid); build(id<<1|1, mid+1, r); nod[id]=max(nod[id<<1], nod[id<<1|1]); } void update(int p, int val) { int id=leaf[p]; nod[id].fi=val; while(id>1) { id>>=1; nod[id]=max(nod[id<<1], nod[id<<1|1]); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i = 0; i < n*m; i++) { cin>>a[i]; if(a[i]==0) cnt[pos(i).fi]++; ve[pos(i).se].emplace_back(a[i], pos(i).fi); } for(int i = 0; i < n*m; i++) cin>>b[i]; for(int i = 0; i < m; i++) sort(ve[i].begin(), ve[i].end(), greater<ii>()); build(1, 0, n-1); while(true) { ii tmp=nod[1]; if(tmp.fi<m) break; res++; for(int j = 0; j < m; j++) cur[j]+=b[rar(tmp.se, j)]; update(tmp.se, -inf); cnt[tmp.se]=-inf; for(int j = 0; j < m; j++) { while(ve[j].size()) { int x, y; tie(x, y)=ve[j].back(); if(x<=cur[j]) cnt[y]++, update(y, cnt[y]), ve[j].pop_back(); else break; } } } cout<<res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...