Submission #784709

#TimeUsernameProblemLanguageResultExecution timeMemory
784709oscar1fCouncil (JOI23_council)C++17
56 / 100
4034 ms37212 KiB
#include<bits/stdc++.h>
using namespace std;

const int MAX_PERS=300*1000+5,MAX_PROP=22,MAX_VAL=(1<<20);

int nbPers,nbChoix,rep,val,bascule,minPerdu;
int choix[MAX_PERS][MAX_PROP];
int somme[MAX_PROP];
int nbOccu[MAX_VAL];
int val1[MAX_VAL];
int memo[MAX_VAL];

int compte1(int nb) {
	int nb1=0;
	while (nb>0) {
		nb1+=nb%2;
		nb/=2;
	}
	return nb1;
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>nbPers>>nbChoix;
	for (int i=0;i<nbPers;i++) {
		for (int j=0;j<nbChoix;j++) {
			cin>>choix[i][j];
			somme[j]+=choix[i][j];
		}
	}
	if (nbPers<=3000) {
		for (int i=0;i<nbPers;i++) {
			rep=0;
			for (int j=0;j<nbPers;j++) {
				if (i!=j) {
					val=0;
					for (int k=0;k<nbChoix;k++) {
						if (somme[k]-choix[i][k]-choix[j][k]>=nbPers/2) {
							val++;
						}
					}
					rep=max(rep,val);
				}
			}
			cout<<rep<<"\n";
		}
	}
	else {
		for (int i=0;i<(1<<nbChoix);i++) {
			val1[i]=compte1(i);
			memo[i]=-1;
		}
		for (int i=0;i<nbPers;i++) {
			val=0;
			for (int j=0;j<nbChoix;j++) {
				val+=(1<<j)*choix[i][j];
			}
			nbOccu[val]++;
		}
		for (int i=0;i<nbPers;i++) {
			rep=0;
			minPerdu=nbChoix;
			bascule=0;
			val=0;
			for (int j=0;j<nbChoix;j++) {
				val+=(1<<j)*choix[i][j];
				if (somme[j]-choix[i][j]>=nbPers/2) {
					rep++;
					if (somme[j]-choix[i][j]-1<nbPers/2) {
						bascule+=(1<<j);
					}
				}
			}
			if (memo[val]!=-1) {
				cout<<memo[val]<<"\n";
			}
			else {
				nbOccu[val]--;
				for (int j=0;j<(1<<nbChoix);j++) {
					if (nbOccu[j]>0) {
						minPerdu=min(minPerdu,val1[j&bascule]);
					}
				}
				nbOccu[val]++;
				memo[val]=rep-minPerdu;
				cout<<rep-minPerdu<<"\n";
			}
		}
	}
	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...