제출 #1154139

#제출 시각아이디문제언어결과실행 시간메모리
1154139Younis_DwaiCouncil (JOI23_council)C++20
25 / 100
152 ms8500 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
#define endl "\n"
#define F first
#define S second
#define pb push_back
#define pf push_front
#define popf pop_frot
#define popb pop_back
//#define int long long
#define in insert
//#define mid (l+r)/2
using namespace std;
const int N=3e5+5;
bool b[N][21];
int best[N],n,m,V[N],cnt[21],ans[N],vis[N],ret=0,need;
void R(int k , int p){
     if(cnt[k]==need && b[p][k]==1) --ret;
     cnt[k]-=b[p][k];
     return ;
}
void A(int k , int p){
     if(cnt[k]==need-1 && b[p][k]==1) ++ret;
     cnt[k]+=b[p][k];
     return ;
}
void R1(int k , int m1,int m2){
     int was=cnt[k];
     cnt[k]-=bool(m1&(1<<(k-1)))+bool(m2&(1<<(k-1)));
     if(was>=need && cnt[k]<need) --ret;
     return ;
}
void A1(int k , int m1,int m2){
     int was=cnt[k];
     cnt[k]+=bool(m1&(1<<(k-1)))+bool((m2&(1<<(k-1))));
     if(was<need && cnt[k]>=need) ++ret;
     return ;
}
int32_t main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>b[i][j];
            cnt[j]+=b[i][j];
            V[i]+=b[i][j]*((1<<(j-1)));
        }
        vis[V[i]]++;
    }
    need=(n)/2;
    for(int j=1;j<=m;j++){
            if(cnt[j]>=need) ++ret;
    }
    if(m<=10){
       for(int mask1=0;mask1<(1<<m);mask1++){
           for(int mask2=0;mask2<(1<<m);mask2++){
               vis[mask1]--;
               vis[mask2]--;
               if(vis[mask1]<0 || vis[mask2]<0){
                        vis[mask1]++;
                        vis[mask2]++;
                        continue ;
               }
               for(int k=1;k<=m;k++){
                   R1(k,mask1,mask2);
               }

               ans[mask1]=max(ans[mask1],ret);
               ans[mask2]=max(ans[mask2],ret);
               for(int k=1;k<=m;k++){
                   A1(k,mask1,mask2);
               }
               vis[mask1]++;
               vis[mask2]++;
           }
       }
    }
    else{
        for(int i=1;i<=n;i++){
            for(int j=1;j<i;j++){
                for(int k=1;k<=m;k++){
                    R(k,i);
                    R(k,j);
                }
                ans[i]=max(ans[i],ret);
                ans[j]=max(ans[j],ret);
                //cout<<" # "<<i<<' '<<j<<' '<<ret<<endl;
                for(int k=1;k<=m;k++){
                    A(k,i);
                    A(k,j);
                }
            }
        }
    }
    for(int i=1;i<=n;i++) cout<<ans[V[i]]<<endl;
    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...