Submission #843941

#TimeUsernameProblemLanguageResultExecution timeMemory
843941biximoCouncil (JOI23_council)C++17
0 / 100
247 ms179288 KiB
#include <bits/stdc++.h>
using namespace std;
using p = pair<int, int>;
int n, m, te, bits[20] = {0};
p dp[1048576][21];
bool poss[1048576] = {0};
vector<int> council, cnts, dpCouncils;
int main() {
    for(auto&i: dp) for(auto&j: i) j = {0, 0};
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m;
    council.resize(n);
    for(auto&i: council) {
        i = 0;
        for(int j = 0; j < m; j ++) {
            cin >> te;
            if(te) {
                i += (1 << j);
                bits[j] ++;
            }
        }
        poss[((1 << m) - 1) & (~i)] = 1;
    }
    for(auto&i: council) {
        int ni = 0;
        int cnt = 0;
        for(int j = 0; j < m; j ++) {
            int cb = bits[j];
            if(i & (1 << j)) cb --;
            if(cb - 1 >= (n) / 2) {
                cnt ++;
            }
            else if(cb >= (n) / 2) {
                ni += (1 << j);
            }
        }
        dpCouncils.push_back(ni);
        cnts.push_back(cnt);
    }
    for(int i = 0; i < (1 << m); i ++) {
        dp[i][0] = {(poss[i] ? __builtin_popcount(i) : 0), 0};
        if((poss[i] ? __builtin_popcount(i) : 0) == 10) {
//            cout << i << "\n";
        }
    }
    for(int j = 1; j <= m; j ++) {
        for(int i = 0; i < (1 << m); i ++) {
            int max1 = dp[i][j - 1].first;
            int max2 = dp[i][j - 1].second;
            auto c = ((i & (1 << (j - 1))) ? dp[i - (1 << (j - 1))][j - 1] : pair<int, int>(dp[i + (1 << (j - 1))][j - 1].first - 1, dp[i + (1 << (j - 1))][j - 1].second - 1));
            if(max1 >= c.first) max2 = max(max2, c.first);
            else {
                max2 = max(max1, c.second);
                max1 = c.first;
            }
            dp[i][j] = {max1, max2};
        }
    }
    for(int i = 0; i < n; i ++) {
        int maxV = 0;
        for(int j = 0; j < m; j ++) {
            int cb = bits[j];
            if(council[i] & (1 << j)) cb --;
            if(cb - 1 >= (n) / 2) {
            }
            else if(cb >= (n) / 2) {
                if(!(council[i] & (1 << j))) maxV ++;
            }
        }
//        cout << maxV << "\n";
//        cout << cnts[i] << "\n";
        cout << cnts[i] + ((maxV == dp[dpCouncils[i]][m].first) ? dp[dpCouncils[i]][m].second : dp[dpCouncils[i]][m].first) << "\n";
        assert(cnts[i] + (maxV == dp[dpCouncils[i]][m].first ? dp[dpCouncils[i]][m].second : dp[dpCouncils[i]][m].first) <= m);
//        cout << cnts[i] << "\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...