제출 #1315362

#제출 시각아이디문제언어결과실행 시간메모리
1315362ezzzay메시지 (IOI24_message)C++17
10 / 100
394 ms844 KiB
#include "message.h"
#include<bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
void send_message(std::vector<bool> M, std::vector<bool> C) {
	vector<int>idx;
	for(int i=0;i<31;i++){
		if(C[i]==0)idx.pb(i); //16 shirheg
	}
	idx.pb(idx[0]);
	for(int i=0;i<5;i++){
		vector<bool>v(31);
		for(int j=0;j<16;j++){
			v[idx[j]]= bool ((1<<i) & (idx[j+1]));
		}
		send_packet(v);
	}
	int L=M.size();
	vector<bool>tmp(31);
	for(int i=0;i<15;i++){
		if(L & (1<<i)){
			tmp[idx[i]]=1;
		}
	}
	send_packet(tmp);
	for(int i=0;i<L/16;i++){
		vector<bool>v(31);
		for(int j=0;j<16;j++){
			v[idx[j]]=M[i*16+j];
		}
		send_packet(v);
	}
	if(L%16){
		vector<bool>v(31);
		for(int j=0;j<L%16;j++){
			v[idx[j]]=M[L-L%16+j];
		}
		send_packet(v);
	}
	
	
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
	vector<int>child(31);
	for(int i=0;i<5;i++){
		for(int j=0;j<31;j++){
			child[j]+= (1<<i) * R[i][j];
		}
	}
	vector<int>idx;
	for(int x=30;x>=0;x--){
		queue<int>q;
		vector<int>dst(31);
		vector<int>par(31);
		par[x]=-1;
		dst[x]=1;
		q.push(x);
		int u=-1;
		while(!q.empty()){
			auto a=q.front();
			q.pop();
			int b=child[a];
			if(dst[b]==0){
				par[b]=a;
				dst[b]=dst[a]+1;
				
				q.push(b);
			}
			if(dst[a]==16 and b==x){
			    u=a;
			    break;
			}
		}
		
		if(u==-1)continue;
		while(u!=-1){
			idx.pb(u);
			u=par[u];
			
		}
		break;
	}
	sort(idx.begin(),idx.end());
	int L=0;
	for(int i=0;i<15;i++){
		if(R[5][idx[i]])L+=(1<<i);
	}
	vector<bool>M(L);
	for(int i=0;i<L/16;i++){
		vector<bool>v(31);
		for(int j=0;j<16;j++){
			M[i*16+j]=R[i+6][idx[j]];
		}
	}
	if(L%16){
		vector<bool>v(31);
		for(int j=0;j<L%16;j++){
			M[L-L%16+j]=R.back()[idx[j]];
		}
	}
	return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...