제출 #1206750

#제출 시각아이디문제언어결과실행 시간메모리
1206750PenguinsAreCuteCouncil (JOI23_council)C++20
100 / 100
781 ms92944 KiB
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> n >> m; int bt[n], zero = 0, one = 0, two = 0, cnt[m]; memset(bt,0,sizeof(bt)); memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { int a; cin >> a; cnt[j] += a; bt[i] |= (a << j); } for(int i=0;i<n;i++) bt[i] = ((1<<m)-1) & (~bt[i]); for(int i=0;i<m;i++) if(cnt[i] >= (n / 2) + 2) zero++; else if(cnt[i] == (n / 2) + 1) one |= (1 << i); else if(cnt[i] == (n / 2)) two |= (1 << i); vector<vector<int>> dp(m+1,vector<int>(1<<m,-1e6)); for(int i=0;i<n;i++) dp[m][bt[i]] = 0; auto up = [&dp,m](int i, int j) { int st = j & ((1 << m) - (1 << (m - i))), qry = j & ((1 << (m - i)) - 1); int qpt = qry & ~(1 << (m - i - 1)); dp[i][j] = max(dp[i+1][st|qpt],dp[i+1][st|1<<(m-i-1)|qpt]+!!(qry&(1<<(m-i-1)))); }; for(int i=m;i--;) for(int j=0;j<(1<<m);j++) up(i, j); int btcnt[1<<m]; memset(btcnt,0,sizeof(btcnt)); for(int i=0;i<n;i++) btcnt[bt[i]]++; for(int i=0;i<n;i++) { int qmask = (one&~bt[i])|(two&bt[i]); if(btcnt[bt[i]] >= 2) cout << zero + __builtin_popcount(one & bt[i]) + dp[0][qmask] << "\n"; else { dp[m][bt[i]] = -1e6; for(int j=m;j--;) up(j,(bt[i]&((1<<m)-(1<<(m-j))))|(qmask&((1<<(m-j))-1))); cout << zero + __builtin_popcount(one & bt[i]) + dp[0][qmask] << "\n"; dp[m][bt[i]] = 0; for(int j=m;j--;) up(j,(bt[i]&((1<<m)-(1<<(m-j))))|(qmask&((1<<(m-j))-1))); } } }
#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...