Submission #1167044

#TimeUsernameProblemLanguageResultExecution timeMemory
1167044anmattroiCouncil (JOI23_council)C++17
100 / 100
896 ms67992 KiB
#include <bits/stdc++.h> #define maxn 300005 #define maxm 25 #define fi first #define se second using namespace std; using ii = pair<int, int>; int n, m; int a[maxn][maxm]; namespace sub1 { int cnt[maxm]; void mainProgram() { int pivot = n/2; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cnt[j] += a[i][j]; for (int i1 = 1; i1 <= n; i1++) { int ans = 0; for (int j = 1; j <= m; j++) cnt[j] -= a[i1][j]; for (int i2 = 1; i2 <= n; i2++) { if (i2 == i1) continue; for (int j = 1; j <= m; j++) cnt[j] -= a[i2][j]; int ds = 0; for (int j = 1; j <= m; j++) ds += (cnt[j] >= pivot); ans = max(ans, ds); for (int j = 1; j <= m; j++) cnt[j] += a[i2][j]; } cout << ans << "\n"; for (int j = 1; j <= m; j++) cnt[j] += a[i1][j]; } exit(0); } } namespace sub2 { int dem[1<<10], cnt[maxm], orz[maxn]; void mainProgram() { int piv = n/2; for (int i = 1; i <= n; i++) { int mask = 0; for (int j = 1; j <= m; j++) { cnt[j] += a[i][j]; mask |= ((a[i][j])<<(j-1)); } orz[i] = mask; ++dem[mask]; } for (int i = 1; i <= n; i++) { int ans = m; for (int j = 1; j <= m; j++) cnt[j] -= a[i][j]; int mask = 0, ds = INT_MAX; for (int j = 1; j <= m; j++) if (cnt[j] < piv) --ans; else if (cnt[j] == piv) mask |= (1<<(j-1)); for (int cmask = 0; cmask < (1<<m); cmask++) if (dem[cmask]-(cmask==orz[i])) ds = min(ds, __builtin_popcount(cmask&mask)); for (int j = 1; j <= m; j++) cnt[j] += a[i][j]; cout << ans-ds << "\n"; } exit(0); } } namespace sub3 { int cnt[1<<14],dem[maxm]; int ans[maxn]; vector<int> nho[1<<14]; void mainProgram() { int piv = n/2; for (int i = 1; i <= n; i++) { int mask = 0; for (int j = 1; j <= m; j++) { mask |= ((a[i][j])<<(j-1)); dem[j] += a[i][j]; } ++cnt[mask]; nho[mask].emplace_back(i); } for (int mask = 0; mask < (1<<m); mask++) { if (nho[mask].empty()) continue; --cnt[mask]; int hmask = 0; for (int j = 0; j < m; j++) dem[j+1] -= (mask>>j&1); for (int j = 0; j < m; j++) if (dem[j+1] == piv) hmask |= (1<<j); for (int j = 0; j < m; j++) dem[j+1] += (mask>>j&1); int orz = INT_MAX; for (int cmask = 0; cmask < (1<<m); cmask++) if (cnt[cmask]) orz = min(orz, __builtin_popcount(hmask&cmask)); for (int idx : nho[mask]) ans[idx] = orz; ++cnt[mask]; } for (int i = 1; i <= n; i++) { int kq = m; for (int j = 1; j <= m; j++) dem[j] -= a[i][j]; int mask = 0; for (int j = 1; j <= m; j++) { if (dem[j] < piv) --kq; } kq -= ans[i]; for (int j = 1; j <= m; j++) dem[j] += a[i][j]; cout << kq << "\n"; } exit(0); } } namespace subfull { const int INF = 1'000'000'000; struct num { int x = INF, tx = INF, y = INF, ty = INF; num() {} num(int _x, int _tx, int _y, int _ty) : x(_x), tx(_tx), y(_y), ty(_ty) {} } f[1<<20], g[1<<20]; void cmn(num &a, const ii &b) { if (a.x > b.fi) a = num(b.fi, b.se, a.x, a.tx); else if (a.y > b.fi && b.se != a.tx) a = num(a.x, a.tx, b.fi, b.se); } void cmin(num &a, const num &b) { cmn(a, ii{b.x, b.tx}); cmn(a, ii{b.y, b.ty}); } int cnt[1<<20], dem[maxm]; void mainProgram() { int piv = n/2; for (int i = 1; i <= n; i++) { int mask = 0; for (int j = 1; j <= m; j++) { mask |= ((a[i][j])<<(j-1)); dem[j] += a[i][j]; } ++cnt[mask]; } for (int mask = 0; mask < (1<<m); mask++) if (cnt[mask]) f[mask] = num(__builtin_popcount(mask), mask, INF, INF); for (int i = 0; i < m; i++) for (int mask = 0; mask < (1<<m); mask++) if ((mask>>i&1) == 0) cmin(f[mask], f[mask^(1<<i)]); for (int mask = 0; mask < (1<<m); mask++) { f[mask].x -= __builtin_popcount(mask); f[mask].y -= __builtin_popcount(mask); } for (int mask = 0; mask < (1<<m); mask++) g[((1<<m)-1)^mask] = f[mask]; for (int i = 0; i < m; i++) for (int mask = 0; mask < (1<<m); mask++) if ((mask>>i&1) == 0) cmin(g[mask], g[mask^(1<<i)]); for (int i = 1; i <= n; i++) { int mask = 0, cur_mask = 0, kq = m; for (int j = 1; j <= m; j++) { dem[j] -= a[i][j]; if (dem[j] < piv) --kq; else if (dem[j] == piv) mask |= (1<<(j-1)); cur_mask |= ((a[i][j])<<(j-1)); } auto [x, tx, y, ty] = g[mask]; if (tx == cur_mask) { if (cnt[cur_mask] > 1) kq -= x; else kq -= y; } else kq -= x; cout << kq << "\n"; for (int j = 1; j <= m; j++) dem[j] += a[i][j]; } exit(0); } } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j]; if (n <= 3000) sub1::mainProgram(); if (m <= 10) sub2::mainProgram(); if (m <= 14) sub3::mainProgram(); subfull::mainProgram(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...