Submission #956684

#TimeUsernameProblemLanguageResultExecution timeMemory
956684ZHIRDILBILDIZCouncil (JOI23_council)C++14
41 / 100
757 ms12420 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
using namespace std;
const int N = 3e5 + 1;
int n, m;
int w[N];
int cnt[20];
signed main () {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        for (int j = 0; j < m; ++j) {
            int x;
            cin >> x;
            w[i] ^= (1 << j) * x;
            cnt[j] += x;
        }
    if (m <= 10) {
        int ans[(1 << m)] = {};
        int us[1 << m + 10] = {};
        for (int i = 1; i <= n; ++i)
            ++us[w[i]];
        for (int msk1 = 0; msk1 < (1 << m); ++msk1) {
            if (!us[msk1])
                continue;
            for (int q = 0; q < m ; ++q)
                if ((1 << q) & msk1)
                    --cnt[q];
            for (int msk2 = 0; msk2 < (1 << m); ++msk2) {
                if (!us[msk2] || msk2 == msk1 && us[msk2] == 1)
                    continue;
                int now = 0;
                for (int q = 0; q < m ; ++q)
                    if ((1 << q) & msk2) {
                        if (cnt[q] - 1 >= n >> 1)
                            ++now;
                    } else {
                        if (cnt[q] >= n >> 1)
                            ++now;
                    }
                ans[msk1] = max(ans[msk1], now);
            }
            for (int q = 0; q < m ; ++q)
                if ((1 << q) & msk1)
                    ++cnt[q];
        }
        for (int i = 1; i <= n; ++i)
            cout << ans[w[i]] << '\n';
        return 0;
    }
    if (n <= 3000) {
        for (int i = 1; i <= n; ++i) {
            int ans = 0;
            for (int q = 0; q < m ; ++q)
                if ((1 << q) & w[i])
                    --cnt[q];
            for (int j = 1; j <= n; ++j) {
                if (i == j)
                    continue;
                int now = 0;
                for (int q = 0; q < m ; ++q)
                    if (((1 << q) & w[j])) {
                        if((cnt[q] - 1) >= n >> 1)
                            ++now;
                    } else {
                        if(cnt[q] >= n >> 1)
                            ++now;
                    }
                ans = max(ans, now);
            }
            for (int q = 0; q < m ; ++q)
                if ((1 << q) & w[i])
                    ++cnt[q];
            cout << ans << '\n';
        }
        return 0;
    }
    return 0;
}

Compilation message (stderr)

council.cpp: In function 'int main()':
council.cpp:23:23: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   23 |         int us[1 << m + 10] = {};
      |                     ~~^~~~
council.cpp:33:47: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   33 |                 if (!us[msk2] || msk2 == msk1 && us[msk2] == 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...