Submission #56986

#TimeUsernameProblemLanguageResultExecution timeMemory
56986hamzqq9Amusement Park (JOI17_amusement_park)C++14
28 / 100
46 ms12592 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();
 
	CENTER=31;

	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();
 
	CENTER=31;

	CurBit=-1;
 
	SpanningTree(CENTER,-1);
 
	dfs2(CENTER,-1);
 
	CurBit=-1;
 
	findPath(CENTER,true);
 
	dfs(CENTER,-1);
 
	return X;
 
}
 
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); 
 
}

Compilation message (stderr)

Joi.cpp:44:13: warning: 'void findPath(int)' defined but not used [-Wunused-function]
 static void findPath(int TO) {
             ^~~~~~~~
Joi.cpp:18:19: warning: 'GMax' defined but not used [-Wunused-variable]
 static int CENTER,GMax;
                   ^~~~

Ioi.cpp:14:34: warning: 'GMax' defined but not used [-Wunused-variable]
 static int CurBit,M,N,P,V,CENTER,GMax;
                                  ^~~~
#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...