Submission #1147367

#TimeUsernameProblemLanguageResultExecution timeMemory
1147367arashMLGCouncil (JOI23_council)C++20
100 / 100
442 ms49432 KiB
#include<bits/stdc++.h> #ifdef LOCAL #include "Essentials/algo/debug.h" #else #define debug(...) 69 #define debugArr(...) 69 #endif using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; const int N = 3e5 + 23; const int M = 20; const ll inf = 1e18; #define F first #define S second #define pb push_back #define kill(x) cout<<x<<endl, exit(0); #define all(x) x.begin(),x.end() #define sz(x) (int)x.size() #define lc (v << 1) #define rc ((v<<1) |1) int n,m; int a[N][M]; int is[1<<M][2]; pii mx[1<<M][2]; int cnt[M]; int32_t main() { cin.tie(nullptr)->sync_with_stdio(false); cin>>n>>m; for(int mask =0; mask < (1 << m); mask++) { is[mask][0] = is[mask][1] = -1; } for(int i = 0; i < n ; i ++) { int mask = 0; for(int j = 0 ; j < m ; j ++) { cin>>a[i][j]; cnt[j] += a[i][j]; if(a[i][j] == 0) mask |= (1 << j); } if(is[mask][0] != -1) is[mask][1] = i; else is[mask][0] = i; } for(int i =0 ; i <m ; i ++) { for(int mask = 0; mask < (1 << m); mask ++) if(((mask>>i)&1) == 0) { int msk = mask | (1 << i); for(int j = 0 ; j < 2; j ++) { if(is[msk][j] == -1) continue; if(is[mask][0] == -1) is[mask][0] = is[msk][j]; else if(is[mask][1] == -1 && is[msk][j] != is[mask][0]) is[mask][1] = is[msk][j]; } } } for(int mask = 0; mask < (1 << m); mask ++) { for(int j = 0 ; j < 2; j ++) { if(is[mask][j] != -1) { mx[mask][j] = { __builtin_popcount(mask),is[mask][j]}; } else { mx[mask][j] = {0,-1}; } } } for(int i = 0;i < m; i ++) { for(int mask = 0; mask < (1 << m); mask ++) if(((mask >> i)&1) == 1) { int msk = mask ^ (1 << i); for(int j = 0 ; j < 2; j ++) { if(mx[msk][j].S == mx[mask][0].S) mx[mask][0] = max(mx[mask][0],mx[msk][j]); else if(mx[msk][j].S == mx[mask][1].S) { mx[mask][1] = max(mx[mask][1],mx[msk][j]); if(mx[mask][1] > mx[mask][0]) swap(mx[mask][0],mx[mask][1]); } else { pii x= mx[msk][j]; for(int k = 0 ; k < 2; k ++) { if(x > mx[mask][k]) swap(x,mx[mask][k]); } } } } } for(int i = 0 ; i< n ; i++) { int mask = 0; int ans =0; for(int j = 0 ;j < m; j ++) if(cnt[j] - a[i][j] == (n/2)) { mask |= (1 << j); } else if(cnt[j] - a[i][j] > (n/2)) { ans ++; } ans += (mx[mask][0].S == i ? mx[mask][1].F : mx[mask][0].F); cout<<ans << '\n'; } return 0; } // Jumpsuit, Jumpsuit cover me! // Jumpsuit, Jumpsuit cover me!
#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...