Submission #920260

#TimeUsernameProblemLanguageResultExecution timeMemory
920260vjudge1Council (JOI23_council)C++17
100 / 100
1012 ms61020 KiB
#include<bits/stdc++.h>
using namespace std;

typedef unsigned long long ll;
#define MAXN (int)pow(2,21)+10

int pc(ll x){
	int now=0;
	while(x){
		now++;
		x^=(x&(-x));
	}
	return now;
}

ll sm[25];
ll num[300010],pnums[300010],pans[300010];
int gs[MAXN];
ll omx[MAXN],osmx[MAXN];
//ll umx[MAXN],usmx[MAXN];

int main(){
	//freopen("try.in","r",stdin);
	//freopen("try2.out","w",stdout);
	memset(gs,0,sizeof gs);
	memset(omx,0,sizeof omx);
	memset(osmx,0,sizeof osmx);
	//memset(umx,0,sizeof umx);
	//memset(usmx,0,sizeof usmx);
	memset(num,0,sizeof num);
	//printf("%d %d %d",((int)pow(2,21)-1)-3,6^((int)pow(2,21)-1),1023^((int)pow(2,21)-1));
	int n,m; scanf("%d %d",&n,&m);
	for (int i=1;i<=n;i++){
		for (int p=1;p<=m;p++){
			int tp; scanf("%d",&tp);
			sm[p]+=tp;
			num[i]+=(tp<<(p-1));
		}
		ll tp=(1<<m)-num[i]-1;
		omx[tp]=tp;
		gs[tp]++;
		//printf("%d %lld\n",i,tp);
		//umx[num[i]]=tp;
	}
	for (int i=1;i<=n;i++){
		ll wfj=0;
		ll tp;
		for (int p=1;p<=m;p++){
			tp=sm[p];
			tp-=(num[i]>>(p-1))&1;
			if (tp==(n/2)){
				wfj+=(1<<(p-1));
			}else if (tp>(n/2)){
				pans[i]++;
			}
		}
		pnums[i]=wfj;
	}
	/*
	for (int i=1;i<=n;i++){
		printf("%lld %lld %d\n",pans[i],pnums[i],n/2);
	}*/
	for (int i=0;i<m;i++){
		for (int p=(1<<m)-1;p>=0;p--){
			if (((p>>i)&1)==1){
				int tp=p-(1<<i);
				//printf("%d %d\n",p,tp);
				if (pc(omx[p]&tp)>pc(osmx[tp]&tp)&&(omx[p]!=omx[tp])){
					osmx[tp]=omx[p];
					if (pc(osmx[tp]&tp)>pc(omx[tp]&tp)) swap(omx[tp],osmx[tp]);
					//printf("%d %d %d %d %d\n",omx[p],tp,osmx[tp],omx[tp],osmx[tp]);	
				}
				if (pc(osmx[p]&tp)>pc(osmx[tp]&tp)&&(osmx[p]!=omx[tp])){
					osmx[tp]=osmx[p];
					if (pc(osmx[tp]&tp)>pc(omx[tp]&tp)) swap(omx[tp],osmx[tp]);
					//printf("%d %d %d %d %d\n",omx[p],tp,osmx[tp],omx[tp],osmx[tp]);
				}
			}
		}
	}
	for (int i=0;i<m;i++){
		for (int p=0;p<(1<<m);p++){
			if (((p>>i)&1)==0){
				int tp=p+(1<<i);
				//printf("%d %d\n",p,tp); 
				if (pc(omx[p]&tp)>pc(osmx[tp]&tp)&&(omx[p]!=omx[tp])){
					osmx[tp]=omx[p];
					if (pc(osmx[tp]&tp)>pc(omx[tp]&tp)) swap(omx[tp],osmx[tp]);
					//printf("%d %d %d %d %d\n",omx[p],tp,osmx[tp],omx[tp],osmx[tp]);	
				}
				if (pc(osmx[p]&tp)>pc(osmx[tp]&tp)&&(osmx[p]!=omx[tp])){
					osmx[tp]=osmx[p];
					if (pc(osmx[tp]&tp)>pc(omx[tp]&tp)) swap(omx[tp],osmx[tp]);
					//printf("%d %d %d %d %d\n",omx[p],tp,osmx[tp],omx[tp],osmx[tp]);
				}
			}
		}
	}
	
	for (int i=1;i<=n;i++){
		int itp=pnums[i];
		int tp1=omx[itp];
		//int tp2=umx[itp];
		/*
		if (((1<<m)-1-tp1)==num[i]){
			//printf("%d %d\n",tp1,num[i]);
			tp1=osmx[itp];
		}*/
		if ((((1<<m)-1-tp1)==num[i])&&(gs[tp1]==1)){
			//printf("tl");
			tp1=osmx[itp];
		}
		/*
		if (tp2==num[i]){
			tp2=usmx[itp];
		}*/
		//printf("%d %d %d %d %lld %lld %lld %lld\n",i,gs[tp1],pc(tp1&itp),pans[i],tp1,itp,num[i],(1<<m)-1-tp1);
		printf("%d\n",pc(tp1&itp)+pans[i]);
	}
}

Compilation message (stderr)

council.cpp: In function 'int main()':
council.cpp:51:10: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long unsigned int'} and 'int' [-Wsign-compare]
   51 |    if (tp==(n/2)){
      |        ~~^~~~~~~
council.cpp:53:16: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long unsigned int'} and 'int' [-Wsign-compare]
   53 |    }else if (tp>(n/2)){
      |              ~~^~~~~~
council.cpp:109:22: warning: comparison of integer expressions of different signedness: 'int' and 'll' {aka 'long long unsigned int'} [-Wsign-compare]
  109 |   if ((((1<<m)-1-tp1)==num[i])&&(gs[tp1]==1)){
      |        ~~~~~~~~~~~~~~^~~~~~~~
council.cpp:118:12: warning: format '%d' expects argument of type 'int', but argument 2 has type 'll' {aka 'long long unsigned int'} [-Wformat=]
  118 |   printf("%d\n",pc(tp1&itp)+pans[i]);
      |           ~^    ~~~~~~~~~~~~~~~~~~~
      |            |               |
      |            int             ll {aka long long unsigned int}
      |           %lld
council.cpp:32:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |  int n,m; scanf("%d %d",&n,&m);
      |           ~~~~~^~~~~~~~~~~~~~~
council.cpp:35:17: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |    int tp; scanf("%d",&tp);
      |            ~~~~~^~~~~~~~~~
#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...