제출 #56979

#제출 시각아이디문제언어결과실행 시간메모리
56979hamzqq9Amusement Park (JOI17_amusement_park)C++14
20 / 100
3048 ms7340 KiB
#include "Joi.h"

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define st first
#define nd second
#define pb push_back
#define MAX 20005
#define sz(x) ((int)x.size())
#define pw(x) (1LL<<(x))

static int N,M,CurBit,A[MAX],B[MAX],Bit[69],VAL[MAX];
static bool COME[MAX];
static vector<int> v[MAX],v2[MAX];
static ll X;
static int CENTER,GMax;

static void CreateGraph() {

	for(int i=0;i<M;i++) {

		v[A[i]].pb(B[i]);
		v[B[i]].pb(A[i]);

	}

}

static void CreateBits() {

	for(int i=0;i<60;i++) {

		Bit[i]=((X&pw(i))>0);

	}

}

static int dist[MAX];
static bool vis[MAX];

static void findPath(int TO) {

	queue< pair<int,int> > Q;

	for(int i=0;i<N;i++) dist[i]=N+10,vis[i]=0;

	Q.push({TO,0});

	while(!Q.empty()) {

		pair<int,int> cur=Q.front();

		Q.pop();

		if(vis[cur.st]) continue ;

		vis[cur.st]=true;

		dist[cur.st]=cur.nd;

		for(int child:v[cur.st]) {

			Q.push({child,cur.nd+1});

		}

	}

}

static void dfs2(int node,int ata) {

	++CurBit;

	MessageBoard(node,Bit[CurBit]);

	VAL[node]=Bit[CurBit];	

	for(int child:v2[node]) {

		if(child==ata) continue ;

		dfs2(child,node);

	}

}

int DEP[MAX];

static void dfs(int node,int ata) {

	int tut=-1;
	int pos=-1;

	for(int i=0;i<sz(v2[node]);i++) {

		int child=v2[node][i];

		dfs(child,node);

		DEP[node]=max(DEP[node],DEP[child]);

		if(DEP[node]==DEP[child]) {

			tut=child;
			pos=i;

		}

	}

	if(~tut) {

		swap(v2[node][pos],v2[node][sz(v2[node])-1]);

	}

	DEP[node]++;

}

static void SpanningTree(int node,int ata,bool SEND) {

	if(CurBit==59 || COME[node]) return ;

	COME[node]=true;

	if(~ata) {

		v2[ata].pb(node);

	}

	++CurBit;

	if(SEND) {

		MessageBoard(node,Bit[CurBit]);

		VAL[node]=Bit[CurBit];
	
	}

	for(int child:v[node]) {

		if(child==ata) continue ;

		SpanningTree(child,node,SEND);

	}

}

static void SUB2() {

	CreateGraph();
	CreateBits();

	CurBit=-1;

	SpanningTree(0,-1,true);

}

static void SUB3() {

	CreateBits();

	for(int i=0;i<N;i++) {

		VAL[i]=Bit[i%60];

		MessageBoard(i,VAL[i]);

	}

}

static void SUB4() {

	CreateGraph();
	CreateBits();

	for(int i=0;i<N;i++) {

		findPath(i);

		int Mx=0;

		for(int j=0;j<N;j++) {

			Mx=max(Mx,dist[j]);

		}

		if(GMax>Mx) {

			GMax=Mx;

			CENTER=i;

		}

	}

	CurBit=-1;

	SpanningTree(CENTER,-1,false);

	dfs(CENTER,-1);

	CurBit=-1;

	dfs2(CENTER,-1);

}

void Joi(int N, int M, int A[], int B[], long long X, int T) {
  	
	::N=N;
	::M=M;

	::X=X;

	for(int i=0;i<M;i++) {

		::A[i]=A[i];
		::B[i]=B[i];

	}

	for(int i=0;i<N;i++) VAL[i]=-1;

	if(T==1 || T==4) SUB4();

	if(T==2) SUB2();

	if(T==3) SUB3();

	for(int i=0;i<N;i++) {

		if(VAL[i]!=-1) continue ;

		MessageBoard(i,0);

	}

}
#include "Ioi.h"

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define st first
#define nd second
#define pb push_back
#define MAX 20005
#define sz(x) ((int) x.size())
#define pw(x) (1LL<<(x))

static int CurBit,M,N,P,V,CENTER,GMax;
static int A[MAX],B[MAX];
static bool COME[MAX];
static vector<int> v[MAX],v2[MAX];
static ll X;

static void CreateGraph() {

	for(int i=0;i<M;i++) {

		v[A[i]].pb(B[i]);
		v[B[i]].pb(A[i]);

	}

}

static void SpanningTree(int node,int ata) {

	if(CurBit==59 || COME[node]) return ;

	COME[node]=true;

	++CurBit;

	if(~ata) {

		v2[ata].pb(node);

	}

	for(int child:v[node]) {

		if(child==ata) continue ;

		SpanningTree(child,node);

	}

}

static void dfs(int node,int ata) {

	++CurBit;

	X+=pw(CurBit)*V;

	for(int child:v2[node]) {

		V=Move(child);

		dfs(child,node);

		if(CurBit<59) V=Move(node);

	}

}

static int dist[MAX];
static bool vis[MAX];

static void findPath(int TO,bool GOON) {

	queue< pair<int,int> > Q;

	for(int i=0;i<N;i++) dist[i]=N+10,vis[i]=0;

	Q.push({TO,0});

	while(!Q.empty()) {

		pair<int,int> cur=Q.front();

		Q.pop();

		if(vis[cur.st]) continue ;

		vis[cur.st]=true;

		dist[cur.st]=cur.nd;

		for(int child:v[cur.st]) {

			Q.push({child,cur.nd+1});

		}

	}

	if(!GOON) return ;

	while(P!=TO) {

		for(int child:v[P]) {

			if(dist[child]==dist[P]-1) {

				V=Move(child);

				P=child;

				break ;

			}

		}

	}

}

static int DEP[MAX];

void dfs2(int node,int ata) {

	int tut=-1;
	int pos=-1;

	for(int i=0;i<sz(v2[node]);i++) {

		int child=v2[node][i];

		dfs2(child,node);

		DEP[node]=max(DEP[node],DEP[child]);

		if(DEP[node]==DEP[child]) {

			tut=child;
			pos=i;

		}

	}

	if(~tut) {

		swap(v2[node][pos],v2[node][sz(v2[node])-1]);

	}

	DEP[node]++;

}

static ll SUB2() {

	CreateGraph();

	CurBit=-1;

	SpanningTree(0,-1);

	findPath(0,true);

	CurBit=-1;

	dfs(P,-1);

	return X;

}

static ll SUB4() {

	CreateGraph();

	for(int i=0;i<N;i++) {

		findPath(i,false);

		int Mx=0;

		for(int j=0;j<N;j++) {

			Mx=max(Mx,dist[j]);

		}

		if(GMax>Mx) {

			GMax=Mx;

			CENTER=i;

		}

	}

	CurBit=-1;

	SpanningTree(CENTER,-1);

	dfs2(CENTER,-1);

	CurBit=-1;

	dfs(CENTER,-1);

}

static ll SUB3() {

	while(P%60 || P+59>=N) {

		P--;

		V=Move(P);

	}

	for(int i=P;i<P+60;i++) {

		X+=pw(i-P)*V;

		if(i+1<N) V=Move(i+1);

	}

	return X;

}

long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) {
  
	::N=N;
	::M=M;
	::P=P;
	::V=V;

	for(int i=0;i<M;i++) {

		::A[i]=A[i];
		::B[i]=B[i];

	}

	if(T==1 || T==4) return SUB4();

	if(T==2) return SUB2();

	if(T==3) return SUB3();	

	assert(0); 

}

컴파일 시 표준 에러 (stderr) 메시지

Ioi.cpp: In function 'long long int SUB4()':
Ioi.cpp:214:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#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...