| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1338500 | moondarkside | Council (JOI23_council) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
std::vector<int>A;
std::vector<pair<pair<int,int>,int>> DIST;
void DISKTRA(int m,vector<int> & Values){
queue<pair<int,pair<int,int>>> Q;
queue<pair<int,pair<int,int>>> S;
for(int i=0;i<Values.size();i++){
Q.push({0,{Values[i],i}});
}
while(!S.empty()){
while(!Q.empty()){
int D=-Q.top().first;
int n=Q.top().second.first;
int ElP=Q.top().second.second;
bool run=false;
if(DIST[n].first.first==-1){
DIST[n].first={D,ElP};
run=true;
}
else if(DIST[n].second==-1 && DIST[n].first.second!=ElP){
DIST[n].second=D;
run=true;
}
Q.pop();
if(run){
for(int i=0;i<m;i++){
if((n & (1<<i)) == 0 ){
Q.push({-D,{n ^ (1<<i),ElP}});
}
else{
S.push({-(D+1),{n ^ (1<<i),ElP}});
}
}
}
}
Q=S;
S.clear();
}
}
int main(){
int n,m;
cin>>n>>m;
vector<int> AM(m);
A=vector<int>(n);
for(int i=0;i<n;i++){
int a=0;
for(int j=0;j<m;j++){
int c;
cin>>c;
a=a| (1<<j)*c;
AM[j]+=c;
}
A[i]=a;
}
DIST=vector<pair<pair<int,int>,int>>(1<<m,{{-1,-1},-1});
int SC=0;
int C=0;
int am=0;
for(int i=0;i<m;i++){
if(AM[i]==n/2){
C=C|(1<<i);
am++;
}
if(AM[i]-1==n/2){
SC=SC|(1<<i);
am++;
}
if(AM[i]-1>n/2){
am++;
}
}
int MIX=SC | C;
for(int i=0;i<n;i++){
A[i]=A[i]&MIX;
}
DISKTRA(m,A);
for(int i=0;i<n;i++){
int element=A[i]^SC;
int amp=am;
if(DIST[element].first.second==i){
amp-=DIST[element].second;
}
else{
amp-=DIST[element].first.first;
}
for(int j=0;j<m;j++){
if((A[i] & C & (1<<j))!=0){
amp--;
}
}
cout<<amp<<"\n";
}
}