Submission #1008418

#TimeUsernameProblemLanguageResultExecution timeMemory
1008418snpmrnhlolCouncil (JOI23_council)C++17
100 / 100
596 ms30596 KiB
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5;
const int M = 20;
pair<int,int> f[1<<M][2];
int f2[M];
int v[N];
void add(int pos,int x,int id){
    for(int i = 0;i < 2;i++){
        if(f[pos][i].second == id){
            f[pos][i].first = max(f[pos][i].first, x);
            if(f[pos][0].first < f[pos][1].first)swap(f[pos][0],f[pos][1]);
            return;
        }
    }
    for(int i = 0;i < 2;i++){
        if(pair<int,int>{x,id} > f[pos][i]){
            pair<int,int> tmp = f[pos][i];
            f[pos][i] = {x,id};
            //cout<<x<<' '<<id<<' '<<pos<<' '<<i<<"ll\n";
            x = tmp.first;
            id = tmp.second;
        }
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i = 0;i < n;i++){
        int nr = 0;
        int cnt = 0;
        for(int j = 0;j < m;j++){
            char ch;
            cin>>ch;
            nr = nr*2 + ch - '0';
            f2[j]+=ch - '0';
        }
        v[i] = nr;
        add((nr^((1<<m) - 1)),__builtin_popcount((nr^((1<<m) - 1))),i + 1);
    }
    for(int i = (1<<m) - 1;i >= 0;i--){
        for(int j = 0;j < m;j++){
            if(i>>j&1){
                add(i^(1<<j),f[i][0].first - 1,f[i][0].second);
                add(i^(1<<j),f[i][1].first - 1,f[i][1].second);
                //f[i^(1<<j)] = f[i] - 1;
            }
        }
    }
    for(int i = 0;i < (1<<m);i++){
        for(int j = 0;j < m;j++){
            if(!(i>>j&1)){
                add(i^(1<<j),f[i][0].first,f[i][0].second);
                add(i^(1<<j),f[i][1].first,f[i][1].second);
            }
        }
        //cout<<f[i][0].first<<' '<<f[i][1].first<<' '<<f[i][0].second<<' '<<f[i][1].second<<'\n';
    }
    for(int i = 0;i < n;i++){
        int ans = 0;
        int nr2 = 0;
        for(int j = 0;j < m;j++){
            bool ok = ((v[i]>>(m - j - 1))&1);
            int nr = f2[j] - ok - 1;
            //cout<<nr<<' '<<n/2<<'\n';
            if(nr + 1 == n/2){
                nr2+=(1<<(m - j - 1));
            }else{
                ans+=bool(nr + 1 > n/2);
            }
        }
        //cout<<nr2<<' '<<f[nr2][0].first<<' '<<f[nr2][0].second<<' '<<f[nr2][1].first<<' '<<f[nr2][1].second<<'\n';
        if(f[nr2][0].second != i + 1){
            ans+=f[nr2][0].first;
        }else{
            ans+=f[nr2][1].first;
        }
        cout<<ans<<'\n';
    }
    return 0;
}

Compilation message (stderr)

council.cpp: In function 'int main()':
council.cpp:31:13: warning: unused variable 'cnt' [-Wunused-variable]
   31 |         int cnt = 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...