Submission #1337459

#TimeUsernameProblemLanguageResultExecution timeMemory
1337459chikien2009Council (JOI23_council)C++20
6 / 100
155 ms18616 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int n, m, a, c, res;
int b[300000], num[20];
pair<int, int> super[1 << 20], sub[1 << 20];

inline bool Comp(int ina, int inb, int base)
{
    return __builtin_popcount(ina | base) <= __builtin_popcount(inb | base);
}

int main()
{
    setup();

    for (int i = 0; i < (1 << 20); ++i)
    {
        sub[i] = super[i] = {-1, -1};
    }
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            cin >> a;
            num[j] += a;
            b[i] += (1 << j) * a;
        }
        if (super[b[i]].first == -1)
        {
            super[b[i]].first = i;
        }
        else
        {
            super[b[i]].second = i;
        }
    }
    for (int i = 0; i < m; ++i)
    {
        for (int j = (1 << m) - 1; j >= 0; --j)
        {
            if (!((j >> i) & 1))
            {
                if (super[j + (1 << i)].first == -1)
                {
                    super[j + (1 << i)] = super[j];
                }
                else if (super[j + (1 << i)].second == -1)
                {
                    super[j + (1 << i)].second = super[j].first;
                }
            }
        }
    }
    for (int i = 0; i < (1 << m); ++i)
    {
        sub[i] = super[i];
    }
    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < (1 << m); ++j)
        {
            if (((j >> i) & 1) && sub[j].first != -1)
            {
                if (sub[j - (1 << i)].first == -1)
                {
                    sub[j - (1 << i)] = sub[j];
                    continue;
                }
                if (sub[j].first != sub[j - (1 << i)].first && sub[j].first != sub[j - (1 << i)].second)
                {
                    if (Comp(b[sub[j].first], b[sub[j - (1 << i)].first], j - (1 << i)))
                    {
                        sub[j - (1 << i)].second = sub[j - (1 << i)].first;
                        sub[j - (1 << i)].first = sub[j].first;
                    }
                    else if (sub[j - (1 << i)].second == -1 || 
                             Comp(b[sub[j].first], b[sub[j - (1 << i)].second], j - (1 << i)))
                    {
                        sub[j - (1 << i)].second = sub[j].first;
                    }
                }
                if (sub[j].second != -1 && sub[j].second != sub[j - (1 << i)].second && sub[j].second != sub[j - (1 << i)].first &&
                    Comp(b[sub[j].second], b[sub[j - (1 << i)].second], j - (1 << i)))
                {
                    sub[j - (1 << i)].second = sub[j].second;
                }
            }
        }
    }
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            num[j] -= ((b[i] >> j) & 1);
        }
        a = res = 0;
        for (int j = 0; j < m; ++j)
        {
            res += (num[j] - 1 >= n / 2);
            if (num[j] - 1 >= n / 2 || num[j] < n / 2)
            {
                a += (1 << j);
            }
        }
        c = (sub[a].first == i ? sub[a].second : sub[a].first);
        if (c == -1)
        {
            cout << res << "\n";
        }
        else
        {
            cout << res + m - __builtin_popcount(b[c] | a) << "\n";
        }
        for (int j = 0; j < m; ++j)
        {
            num[j] += ((b[i] >> j) & 1);
        }
    }
    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...