Submission #1162329

#TimeUsernameProblemLanguageResultExecution timeMemory
1162329brintonCouncil (JOI23_council)C++20
6 / 100
152 ms22080 KiB
#include <bits/stdc++.h>
using namespace std;

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    //start here
    int N,k;
    cin >> N >> k;
    vector<vector<int>> A(N,vector<int>(k));
    for(auto &i:A){
        for(auto &j:i)cin >> j;
    }
    // 0: < 絕,1: = 絕, 2: = 絕+1, 3: > 絕+1;
    vector<int> cnt(k,0);
    for(auto &v:A){
        for(int i = 0;i < k;i++){
            cnt[i] += v[i];
        }
    }
    vector<array<pair<int,int>,2>> dp((1 << k),{make_pair(0,-1),make_pair(0,-1)});//{{cnt1,loc1},{cnt2,loc2}};
    for(int loc = 0;loc < N;loc++){
        auto i = A[loc];
        // reverse
        int key = 0;
        for(auto &j:i){
            key*=2;
            key += j;
        }
        // cout << ((~key)&((1 << k)-1)) << endl;
        key = ((~key)&((1 << k)-1));

        dp[key][1] = max(dp[key][1],{__builtin_popcount(key),loc});
        if(dp[key][1] > dp[key][0])swap(dp[key][1],dp[key][0]);
    }
    // push lazy tag
    for(int mask = (1 << k)-1;mask >= 0;mask--){
        // push_down
        for(int i = 0;i < k;i++){
            if((mask|(1 << i)) == mask){
                // push_0
                int nxt = mask-(1 << i);
                auto [cnt1,loc1] = dp[mask][0];
                auto [cnt2,loc2] = dp[mask][1];

                dp[nxt][1] = max(dp[nxt][1],{cnt1-1,loc1});
                if(dp[nxt][1] > dp[nxt][0])swap(dp[nxt][1],dp[nxt][0]);
                dp[nxt][1] = max(dp[nxt][1],{cnt2-1,loc2});
                if(dp[nxt][1] > dp[nxt][0])swap(dp[nxt][1],dp[nxt][0]);
            }
        }
    }
    // bitmask dp
    for(int mask = 0;mask < (1 << k);mask++){
        // pull up
        for(int i = 0;i < k;i++){
            if((mask|(1 << i)) == mask){
                int prev = mask-(1 << i);
                dp[mask][1] = max(dp[mask][1],dp[prev][0]);
                if(dp[mask][1] > dp[mask][0]) swap(dp[mask][1],dp[mask][0]);
                dp[mask][1] = max(dp[mask][1],dp[prev][1]);
                if(dp[mask][1] > dp[mask][0]) swap(dp[mask][1],dp[mask][0]);
                // dp[mask] = max(dp[mask],dp[mask-(1 << i)]);
            }
        }
    }
    // for(int i = 0;i < (1 << k);i++){
    //     cout << i << ":" << dp[i] << endl;
    // }
    for(int loc = 0;loc < N;loc++){
        auto v = A[loc];
        // answer query
        int ans = 0;
        int mask = 0;
        for(int i = 0;i < k;i++){
            if(cnt[i] > N/2+1){
                // cout << "A";
                ans++;
                continue;
            }
            if(cnt[i] < N/2){
                // cout << "B";
                continue;
            }
            if(v[i] == 1){
                if(cnt[i] == N/2){
                    // cout << "C";
                    continue;
                }else{
                    // cout << "D";
                    mask |= (1 << (k-i-1));
                }
            }else{
                if(cnt[i] == N/2){
                    // cout << "E";
                    mask |= (1 << (k-i-1));
                }else{
                    // cout << "F";
                    ans++;
                    continue;
                }
            }
        }
        // cout << ans << " " << mask << endl;
        if(dp[mask][0].second == loc){
            ans += dp[mask][1].first;
        }else{
            ans += dp[mask][0].first;
        }
        cout << ans << '\n';
    }
}
/*
dp[i] = {{cnt1,mask1},{cnt2,mask2}};



*/
#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...