제출 #1251217

#제출 시각아이디문제언어결과실행 시간메모리
1251217model_code이주 (IOI25_migrations)C++20
83.69 / 100
101 ms568 KiB
// solution/shahali_Z4_M17.cpp
// {
//   "verdict": "partially_correct",
//   "except": {
//     "from_root": "correct",
//     "samples": "correct"
//   }
// }
// END HEADER
#include "migrations.h"
#include<bits/stdc++.h>
#pragma GCC optimize ("O2,unroll-loops")

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<int, pii> pi3;
typedef pair<ll, int> pli;
typedef vector<int> vi;
#define debug(x) cerr<<#x<<'='<<(x)<<endl;
#define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl;
#define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl;
#define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;}
#define all(x) x.begin(), x.end()
#define pb push_back
#define SZ(x) ((int)x.size())
#define kill(x) return cout<<x<<'\n', 0;
#define getbit(x,y) (((x)>>(y))&1)
#define popcount(x) (__builtin_popcount(x))

const int inf=1000000010;
const ll INF=1000000000000001000LL;
const int mod=998244353;
const int MAXN=10010, LOG4=7, LOG3=9, TRESHOLD=24;

int n, m, k, x, y;
int par[MAXN], h[MAXN], ans, tmp, curr;
int fx[MAXN], fy[MAXN];

int dist(int u, int v){
	int res=0;
	while (u!=v){
		if (h[u]<h[v]) v=par[v];
		else u=par[u];
		res++;
	}
	return res;
}

int get_type(int v){
	if (dist(x, v)>ans) return 1;
	if (dist(y, v)>ans) return 2;
	return 0;
}

int send_message(int _N, int v, int _P) {
	n=_N;
	par[v]=_P;
	h[v]=h[par[v]]+1;
	if (v==1){
		ans=1;
		x=0;
		y=1;
		return 0;
	}

	if (n<=TRESHOLD){
		if (dist(x, v)>ans){
			y=v;
			ans++;
			return 1;
		}
		if (dist(v, y)>ans){
			x=v;
			ans++;
			return 2;
		}
		return 0;
	}

	// n > 24
	fx[v]=fy[v]=0;
	if (dist(x, v)>ans){
		y=v;
		fy[v]=1;
		ans++;
	}
	else if (dist(v, y)>ans){
		x=v;
		fx[v]=1;
		ans++;
	}
	
	if (v<n-17) return 0;

	if (v==n-17) tmp=x;
	if (v<n-10){
		if (fx[v]) return 0;
		int out = tmp%4 + 1;
		tmp/=4;
		return out;
	}

	if (v==n-10) tmp=y;
	if (v<n-3){
		if (fy[v]) return 0;
		int out = tmp%4 + 1;
		tmp/=4;
		return out;
	}
	
	// v>=n-3
	if (v==n-3){
		tmp=0;
		for (int i=1; i<=7; i++) if (fx[n-10+(i-1)]) tmp=i;
	}
	int res=0;
	if (fy[v]) res=1;
	if (fx[v]) res=2, tmp=0;
	if (tmp&(1<<(n-v-1))) res+=3;
	return res;
}

pii longest_path(vi S) {
	n=SZ(S);
	if (n<=TRESHOLD){
		x=0;
		y=1;
		for (int i=2; i<n; i++){
			if (S[i]==1) y=i;
			if (S[i]==2) x=i;
		}
		return {x, y};
	}

	x=0;
	for (int i=n-17; i<n-10; i++) if (!S[i]) x=i;
	if (!x){
		for (int i=n-11; i>=n-17; i--)
			x = 4*x + (S[i]-1);
	}

	y=0;
	for (int i=n-10; i<n-3; i++) if (!S[i]) y=i;
	if (!y){
		for (int i=n-4; i>=n-10; i--){
			y = 4*y + (S[i]-1);
			// debug2(S[i], y)
		}
	}
	debug2(x, y)

	int shit=0;
	for (int i=n-3; i<n; i++){
		int tmp=S[i];
		if (tmp>=3){
			tmp-=3;
			shit|=(1<<(n-i-1));
		}
		if (tmp==1) y=i;
		if (tmp==2) x=i;
	}
	if (x<n-3 && shit) x=n-10+(shit-1);
	return {x, y};	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...