Submission #799868

#TimeUsernameProblemLanguageResultExecution timeMemory
799868phoenixCouncil (JOI23_council)C++17
100 / 100
1373 ms92216 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 300010; const int M = 20; int n, m; int a[N]; int pr[(1 << M)][5]; vector<int> v[(1 << M)]; void add(int msk, int i) { if((int)v[msk].size() == 2) return; if(v[msk].empty() || v[msk].back() != i) v[msk].push_back(i); } int func(int msk, int i) { return __builtin_popcount((msk & a[i])); } void add1(int msk, int i) { if(pr[msk][0] == i || pr[msk][1] == i) return; pr[msk][2] = i; if(func(msk, pr[msk][2]) < func(msk, pr[msk][1])) swap(pr[msk][1], pr[msk][2]); if(func(msk, pr[msk][1]) < func(msk, pr[msk][0])) swap(pr[msk][0], pr[msk][1]); if(func(msk, pr[msk][2]) < func(msk, pr[msk][1])) swap(pr[msk][1], pr[msk][2]); } void print(int x) { for(int j = 0; j < m; j++) cout << ((x >> j) & 1); cout << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin >> n >> m; vector<int> cnt(m); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { bool bt; cin >> bt; if(bt) { a[i] |= (1 << j); cnt[j]++; } } } if(n <= 3000) { for(int i = 0; i < n; i++) { for(int k = 0; k < m; k++) if(a[i] >> k & 1) cnt[k]--; int ans = 0; for(int j = 0; j < n; j++) { if(i == j) continue; int kol = 0; for(int k = 0; k < m; k++) { if(cnt[k] - (a[j] >> k & 1) >= n / 2) kol++; } ans = max(ans, kol); } for(int k = 0; k < m; k++) if(a[i] >> k & 1) cnt[k]++; cout << ans << '\n'; } return 0; } for(int i = 0; i < n; i++) add((((1 << m) - 1) ^ a[i]), i); for(int i = 0; i < m; i++) for(int msk = 0; msk < (1 << m); msk++) { if(~msk >> i & 1) { for(int x : v[msk + (1 << i)]) add(msk, x); } } for(int msk = 0; msk < (1 << m); msk++) { pr[msk][0] = 0; pr[msk][1] = 1; pr[msk][2] = 2; for(int x : v[msk]) add1(msk, x); } for(int i = 0; i < m; i++) for(int msk = (1 << m) - 1; msk >= 0; msk--) { if(msk >> i & 1) { for(int c : pr[msk - (1 << i)]) add1(msk, c); } } // for(int msk = 0; msk < (1 << m); msk++) { // pr[msk][0] = 0; pr[msk][1] = 1; // for(int x = msk; x > 0; x = ((x - 1) & msk)) { // for(int c : v[x]) { // add1(msk, c); // } // } // } for(int i = 0; i < n; i++) { int msk = 0, ans = 0; for(int j = 0; j < m; j++) { int x = cnt[j] - (a[i] >> j & 1); if(x >= n / 2) ans++; if(x == n / 2) msk |= (1 << j); } int k = pr[msk][(pr[msk][0] == i)]; ans -= func(msk, k); cout << ans << '\n'; } }
#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...