제출 #1184294

#제출 시각아이디문제언어결과실행 시간메모리
1184294GrayCouncil (JOI23_council)C++20
62 / 100
4049 ms763900 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
#define ff first
#define ss second
#define ln "\n"
#define mp make_pair
#define pb push_back
#define INF (ll)2e18
#define MOD (ll)(1e9+7)

void solve(){
    ll n, m; cin >> n >> m;
    vector<vector<pair<ll, ll>>> gr(1<<m);

    for (ll i=0; i<(1<<m); i++){
        for (ll j=0; j<m; j++){
            if (i&(1<<j)){
                gr[i].push_back({i^(1<<j), 1});
            }else{
                gr[i].push_back({i^(1<<j), 0});
            }
        }
    }
    vector<ll> vals(n);
    vector<vector<pair<ll, ll>>> cost(1<<m, vector<pair<ll, ll>>(2, {INF, -1}));
    priority_queue<pair<pair<ll, ll>, ll>, vector<pair<pair<ll, ll>, ll>>, greater<pair<pair<ll, ll>, ll>>> que;
    for (ll i=0; i<n; i++){
        ll res=0; for (ll j=0; j<m; j++){
            ll x; cin >> x;
            if (x) res+=(1<<j);
        }
        vals[i]=res;
        que.push({{0, res}, i});
        // cost[res][0] = {0, i};
    }
    vector<vector<bool>> vis((1<<m), vector<bool>(2));
    while (!que.empty()){
        ll u, w; tie(w, u) = que.top().ff;
        ll cf = que.top().ss; que.pop();
        if (!vis[u][0]){
            cost[u][0] = {w, cf}; vis[u][0]=1;
        }else if (!vis[u][1] and cf!=cost[u][0].ss){
            cost[u][1] = {w, cf}; vis[u][1]=1;
        }else continue;
        for (auto [v, c]:gr[u]){
            if (cost[v][0].ff==INF) {
                que.push({{c+w, v}, cf});
            }else if (cost[v][1].ff==INF and cost[v][0].ss!=cf){
                que.push({{c+w, v}, cf});
            }
        }
    }
    vector<ll> cnt(m);
    for (ll i=0; i<n; i++) for (ll j=0; j<m; j++) if (vals[i]&(1<<j)) cnt[j]++;

    for (ll i=0; i<n; i++){
        for (ll j=0; j<m; j++){
            if (vals[i]&(1<<j)) cnt[j]--;
        }
        ll res=0, find=0;
        for (ll j=0; j<m; j++){
            if (cnt[j]>n/2){
                res++; find+=(1<<j);
            }else if (cnt[j]<n/2){
                find+=(1<<j);
            }else if (cnt[j]==n/2){
                res++;
            }
        }
        // cout << find << ": ";
        cout << res-(cost[find][0].ss==i?cost[find][1].ff:cost[find][0].ff) << ln;
        for (ll j=0; j<m; j++){
            if (vals[i]&(1<<j)) cnt[j]++;
        }
    }
}
/*
9-2
101110010001

*/
int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    #ifdef LOCAL
    auto start = chrono::high_resolution_clock::now();
    #endif
    ll t=1;
    // cin >> t;
    for (ll c=1; c<=t; c++) solve();
    #ifdef LOCAL
    auto duration = chrono::duration_cast<chrono::microseconds>(chrono::high_resolution_clock::now() - start);
    cout << setprecision(0) << fixed << "time: " << (double)duration.count()/1000.0 << " milliseconds" << endl;
    #endif
}
#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...