Submission #925990

#TimeUsernameProblemLanguageResultExecution timeMemory
925990andrei_boacaCouncil (JOI23_council)C++17
100 / 100
633 ms56016 KiB
#include <bits/stdc++.h> using namespace std; int n,m,v[300005][25],me[300005],have[(1<<20)+1],sol[(1<<20)+1]; int suma[25],dp[(1<<20)+1]; bool isover(int a,int b) { return a>=b&&(a^b)==(a-b); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) { int mask=0; for(int j=1;j<=m;j++) { cin>>v[i][j]; mask=(mask*2+v[i][j]); suma[j]+=v[i][j]; } me[i]=mask; have[mask]=1; dp[mask]++; } for(int bit=0;bit<m;bit++) for(int mask=0;mask<(1<<m);mask++) if((mask>>bit)&1) dp[mask]=dp[mask]+dp[mask^(1<<bit)]; for(int mask=0;mask<(1<<m);mask++) if(have[mask]) { int need=0,can=0; for(int i=m-1;i>=0;i--) { need*=2; int val=((mask>>i)&1); int poz=m-i; int s=suma[poz]-val; if(s-1>=n/2) { sol[mask]++; need++; } if(s<n/2) need++; if(s==n/2) { need+=0; can++; } } int best=0; for(int overmask=need;overmask<(1<<m);overmask=(overmask+1)|need) if(dp[overmask]-isover(overmask,mask)>0) { int nr=__builtin_popcount(overmask-need); nr=can-nr; best=max(best,nr); if(best==can) break; } sol[mask]+=best; } for(int i=1;i<=n;i++) cout<<sol[me[i]]<<'\n'; return 0; }
#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...