#include "migrations.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> S = {33,9,5,3,3};
vector<int> K = {140,20,6,2,2};
vector<int> M = {9828,438,69,20,9};
vector<int> T = {9827,9967,9987,9993,9995};
int ptr=0;
pair<int,int> ret;
vector<int> A,B;
vector<vector<int>> G;
int get_far(int s,int N){
vector<int> d(N,-1);
queue<int> q;q.push(s);d[s]=0;
while(!q.empty()){
int u=q.front();q.pop();
for(int v:G[u]) if(d[v]==-1) q.push(v),d[v]=d[u]+1;
}
return max_element(d.begin(),d.end())-d.begin();
}
pair<int,int> get_diameter(int N){
int u=get_far(0,N);
int v=get_far(u,N);
if(u>v) swap(u,v);
return {u,v};
}
void init(){
G.push_back({});
A.push_back(0);
B.push_back(0);
ret={-1,-1};
}
vector<int> sub(vector<int> &v,int x,int k){
int l=x*k,r=min((x+1)*k,(int)v.size());
return vector<int>(v.begin()+l,v.begin()+r);
}
int f(vector<int> &v,int x){
for(int i=0;i<(int)v.size();i++) if(v[i]==x) return i;
return -1;
}
bool eq(pair<int,int> a,pair<int,int> b){
if(a==b) return true;
swap(a.first,a.second);
return (a==b);
}
vector<vector<int>> T0 = {{0,1,4,5,6},{1,0,8,7,6},{4,5,2,3,8},{2,3,8,7,6},{8,3,5,6,7}};
vector<vector<int>> T1 = {{0,1,2},{0,1,3},{0,5,4},{2,3,5},{0,1,5}};
vector<vector<int>> T2 = {{0,2},{1,2},{0,3},{1,3},{2,3}};
int send_message(int N, int i, int p) {
if(i==1) init();
G.push_back({p});
G[p].push_back(i);
if(i<N-3) A.push_back(i),B.push_back(i);
if(i==T[ptr]){
auto [u,v]=get_diameter(N);
if(f(A,u)==-1 || f(B,v)==-1) swap(u,v);
u=f(A,u),v=f(B,v);
assert(u!=-1 && v!=-1);
int X=(M[ptr]-1)/S[ptr]+1;
u/=X,v/=X;
A=sub(A,u,X),B=sub(B,v,X);
int val;
if(!ptr) val=S[ptr]*u-u*(u-1)/2+v-u;
else val=u*S[ptr]+v;
if(val) val--,ret={i+val/4,val%4+1};
ptr++;
}
if(i==ret.first) return ret.second;
if(i==N-3){
while((int)A.size()<4) A.push_back(0);
while((int)B.size()<4) B.push_back(0);
A.insert(A.end(),B.begin(),B.end());B.clear();
A.push_back(i);
auto P=get_diameter(N);
for(int x=0;x<=4;x++){
B.clear();
for(int j:T0[x]) B.push_back(A[j]);
bool ok=false;
for(int j=0;j<=1;j++) for(int k=2;k<=4-j;k++) if(eq(P,{B[j],B[k]})) ok=true;
if(ok){
A=B;
return x;
}
}
assert(false);
}
if(i==N-2){
A.push_back(i);
auto P=get_diameter(N);
for(int x=0;x<=4;x++){
B.clear();
for(int j:T1[x]) B.push_back(A[j]);
bool ok=false;
for(int j=0;j<=1;j++) if(eq(P,{B[j],B[2]})) ok=true;
if(ok){
A=B;
return x;
}
}
assert(false);
}
if(i==N-1){
A.push_back(i);
auto P=get_diameter(N);
for(int x=0;x<=4;x++){
pair<int,int> Q = {A[T2[x][0]],A[T2[x][1]]};
if(eq(P,Q)) return x;
}
assert(false);
}
return 0;
}
pair<int,int> longest_path(vector<int> C){
int N=(int)C.size(),lst=0;
ptr=0;
A.clear();B.clear();
while(ptr<(int)T.size()){
for(int i=lst;i<=T[ptr];i++) A.push_back(i),B.push_back(i);
int i=T[ptr],val=0;
for(int j=0;j<K[ptr];j++) if(C[i+j]) val=j*4+C[i+j];
int u=0,v=0;
if(!ptr){
while(val>=(S[ptr]-u)) val-=(S[ptr]-u),u++;
v=u+val;
}
else u=val/S[ptr],v=val%S[ptr];
int X=(M[ptr]-1)/S[ptr]+1;
A=sub(A,u,X);B=sub(B,v,X);
lst=T[ptr]+1;
ptr++;
}
A.push_back(lst);
B.push_back(lst);
while((int)A.size()<4) A.push_back(0);
while((int)B.size()<4) B.push_back(0);
A.insert(A.end(),B.begin(),B.end());B.clear();
A.push_back(N-3);
B.clear();
for(int j:T0[C[N-3]]) B.push_back(A[j]);
A=B;
A.push_back(N-2);
B.clear();
for(int j:T1[C[N-2]]) B.push_back(A[j]);
A=B;
A.push_back(N-1);
int x=C[N-1];
return {A[T2[x][0]],A[T2[x][1]]};
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |