Submission #514823

#TimeUsernameProblemLanguageResultExecution timeMemory
514823amunduzbaevAmusement Park (JOI17_amusement_park)C++14
100 / 100
80 ms5840 KiB
#include "bits/stdc++.h"
using namespace std;
#include "Joi.h"

const int N = 1e4 + 5;
vector<int> G[N], tt, ee[N];
int used[N], in[N], cnt = 1;
bitset<60> gg[60], uu;

void dfs(int u){
	used[u] = 1;
	for(auto x : G[u]){
		if(used[x]) continue;
		ee[u].push_back(x);
		ee[x].push_back(u);
		if((int)tt.size() < 60){
			in[x] = tt.size();
			gg[in[u]][in[x]] = gg[in[x]][in[u]] = 1;
			tt.push_back(x);
			dfs(x); continue;
		}
		int par = -1;
		bitset<60> tmp;
		for(int i=0;i<60;i++){
			if(i == in[u]) continue;
			int cc = 0;
			for(int j=0;j<60;j++) cc += gg[i][j];
			if(cc != 1) continue;
			
			tmp = gg[i], par = tt[i];
			for(int j=0;j<60;j++) gg[i][j] = gg[j][i] = 0;
			tt[i] = x;
			gg[in[u]][i] = gg[i][in[u]] = 1;
			in[x] = i;
			break;
		}
		dfs(x);
		
		//~ assert(~par);
		for(int j=0;j<60;j++){
			gg[in[par]][j] = gg[j][in[par]] = tmp[j];
		} tt[in[par]] = par;
	}
}

void Joi(int n, int m, int a[], int b[], long long x, int t){
	for(int i=0;i<m;i++){
		G[a[i]].push_back(b[i]);
		G[b[i]].push_back(a[i]);
	} for(int i=0;i<n;i++){
		sort(G[i].begin(), G[i].end());
	}
	
	tt.push_back(0);
	memset(in, -1, sizeof in);
	in[0] = 0; dfs(0);
	
	//~ for(int i=0;i<n;i++) cout<<in[i]<<" ";
	//~ cout<<"\n";
	
	for(int i=0;i<n;i++){
		assert(~in[i]);
		MessageBoard(i, x >> in[i] & 1);
	}
}
#include "bits/stdc++.h"
using namespace std;
#include "Ioi.h"

const int N = 1e4 + 5;
vector<int> G[N], tt, ee[N];
int used[N], in[N], cnt = 1;
bitset<60> gg[60], uu;

void dfs(int u){
	used[u] = 1;
	for(auto x : G[u]){
		if(used[x]) continue;
		ee[u].push_back(x);
		ee[x].push_back(u);
		if((int)tt.size() < 60){
			in[x] = tt.size();
			gg[in[u]][in[x]] = gg[in[x]][in[u]] = 1;
			tt.push_back(x);
			dfs(x); continue;
		}
		int par = -1;
		bitset<60> tmp;
		for(int i=0;i<60;i++){
			if(i == in[u]) continue;
			int cc = 0;
			for(int j=0;j<60;j++) cc += gg[i][j];
			if(cc != 1) continue;
			
			tmp = gg[i], par = tt[i];
			for(int j=0;j<60;j++) gg[i][j] = gg[j][i] = 0;
			tt[i] = x;
			gg[in[u]][i] = gg[i][in[u]] = 1;
			in[x] = i;
			break;
		}
		dfs(x);
		
		//~ assert(~par);
		for(int j=0;j<60;j++){
			gg[in[par]][j] = gg[j][in[par]] = tmp[j];
		} tt[in[par]] = par;
	}
}

long long Ioi(int n, int m, int a[], int b[], int p, int v, int t){
	for(int i=0;i<m;i++){
		G[a[i]].push_back(b[i]);
		G[b[i]].push_back(a[i]);
	} for(int i=0;i<n;i++){
		sort(G[i].begin(), G[i].end());
	}
	
	tt.push_back(0);
	memset(in, -1, sizeof in);
	in[0] = 0; dfs(0);
	
	//~ for(int i=0;i<n;i++) cout<<in[i]<<" ";
	//~ cout<<"\n";
	
	memset(used, 0, sizeof used);
	long long x = 0;
	function<void(int)> go = [&](int u){
		used[u] = uu[in[u]] = 1;
		if(v) x |= (1ll << in[u]);
		for(auto x : ee[u]){
			if(used[x] || uu[in[x]]) continue;
			v = Move(x), go(x),
			v = Move(u);
		}
	};
	go(p);
	for(int i=0;i<60;i++) assert(uu[i]);
	
	return x;
}
#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...