Submission #1176674

#TimeUsernameProblemLanguageResultExecution timeMemory
1176674MongHwaCouncil (JOI23_council)C++20
41 / 100
4091 ms2452 KiB
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")
#include <iostream>
using namespace std;

int vote[300005][25];
int cnt[25];
int arr[300005], val[1<<20], calc[1<<20];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n >> m;

    if(n <= 3000)
    {
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
            {
                cin >> vote[i][j];
                cnt[j] += vote[i][j];
            }
        
        for(int i = 0; i < n; i++)
        {
            int ans = 0;
            for(int j = 0; j < m; j++)
                cnt[j] -= vote[i][j];
            
            for(int j = 0; j < n; j++)
            {
                if(i == j)
                    continue;

                int cur = 0;
                for(int k = 0; k < m; k++)
                {
                    cnt[k] -= vote[j][k];
                    if(cnt[k] >= n/2)
                        cur++;
                }

                ans = max(ans, cur);
                for(int k = 0; k < m; k++)
                    cnt[k] += vote[j][k];
            }

            cout << ans << '\n';
            for(int j = 0; j < m; j++)
                cnt[j] += vote[i][j];
        }
    }
    else if(m <= 14)
    {
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                int x;
                cin >> x;

                if(x == 1)
                {
                    arr[i] |= (1<<j);
                    cnt[j]++;
                }
            }

            val[arr[i]]++;
        }

        for(int i = 0; i < (1<<m); i++)
        {
            if(val[i] == 0)
                continue;
            
            val[i]--;
            for(int j = 0; j < (1<<m); j++)
            {
                int cur = 0;
                if(val[j] == 0)
                    continue;
                for(int k = 0; k < m; k++)
                    if(cnt[k]-((i & (1<<k)) > 0)-((j & (1<<k))> 0) >= n/2)
                        cur++;

                calc[i] = max(calc[i], cur);
            }
            
            val[i]++;
        }

        for(int i = 0; i < n; i++)
            cout << calc[arr[i]] << '\n';
    }
    else
        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...