제출 #1310077

#제출 시각아이디문제언어결과실행 시간메모리
1310077exoworldgd이주 (IOI25_migrations)C++20
0 / 100
190 ms748 KiB
#include "migrations.h" #include <bits/stdc++.h> #define exoworldgd cin.tie(0)->sync_with_stdio(0),cout.tie(0) using namespace std; using ll=long long; vector<int>p,dep,c0,c1,csz={182,25,6,1,1,1,1,1}; int n,e1,e2,cst,cid; int getd(int v){ if(dep[v]==-1)dep[v]=(v==0)?0:getd(p[v])+1; return dep[v]; } int lca(int u,int v){ while(u!=v)getd(u)>getd(v)?u=p[u]:v=p[v]; return u; } int dist(int u,int v){ int l=lca(u,v); return getd(u)+getd(v)-2*getd(l); } int send_message(int N,int i,int Pi){ if(i==1){ n=N,p.assign(N,0),dep.assign(N,-1),e1=0,e2=0,cst=1,cid=0; c0.clear(),c1.clear(); for(int j=0;j<N;j++)c0.push_back(j),c1.push_back(j); } p[i]=Pi,dep[i]=-1; int d1=dist(i,e1),d2=dist(i,e2),cd=dist(e1,e2),nd=max({cd,d1,d2}); nd>cd?(d1>=d2?e2=i:e1=i,0):0; c0.push_back(i),c1.push_back(i); if(i==cst+csz[cid]-1||i==N-1){ int s0=c0.size(),s1=c1.size(),B=csz[cid],msg=0; if(!cid){ int k=floor(sqrt(4.0*B+1)),ns0=(s0+k-1)/k,b0=-1,b1=-1; for(int j=0;j<k;j++){ for(int x=j*ns0;x<min((j+1)*ns0,s0);x++)c0[x]==e1?b0=j:0; for(int x=j*((s1+B-1)/k);x<min((j+1)*((s1+B-1)/k),s1);x++)c1[x]==e2?b1=j:0; } msg=b0*k+b1+1; vector<int>nc0,nc1; for(int j=b0*ns0;j<min((b0+1)*ns0,s0);j++)nc0.push_back(c0[j]); for(int j=b1*((s1+B-1)/k);j<min((b1+1)*((s1+B-1)/k),s1);j++)nc1.push_back(c1[j]); c0=nc0,c1=nc1; }else if(s0<=4&&s1<=4){ int i0=-1,i1=-1; for(int j=0;j<s0;j++)c0[j]==e1?i0=j:0; for(int j=0;j<s1;j++)c1[j]==e2?i1=j:0; msg=i0*s1+i1+1; c0={e1},c1={e2}; }else{ int k=floor(sqrt(4.0*B+1)),ns=(s0+k-2)/k+1,b0=-1,b1=-1; for(int j=0;j<k;j++){ for(int x=j*ns;x<min((j+1)*ns,s0);x++)c0[x]==e1?b0=j:0; for(int x=j*ns;x<min((j+1)*ns,s1);x++)c1[x]==e2?b1=j:0; } msg=b0*k+b1+1; vector<int>nc0,nc1; for(int j=b0*ns;j<min((b0+1)*ns,s0);j++)nc0.push_back(c0[j]); for(int j=b1*ns;j<min((b1+1)*ns,s1);j++)nc1.push_back(c1[j]); c0=nc0,c1=nc1; } cid++,cst=i+1; return msg; } return 0; } pair<int,int>longest_path(vector<int>S){ int N=S.size(); vector<int>c0,c1; for(int j=0;j<N;j++)c0.push_back(j),c1.push_back(j); int cid=0,cst=1; for(int i=1;i<N;i++){ c0.push_back(i),c1.push_back(i); if(S[i]&&cid<8){ int msg=S[i]-1,B=csz[cid],s0=c0.size(),s1=c1.size(); if(cid==0){ int k=floor(sqrt(4.0*B+1)),b0=msg/k,b1=msg%k,ns0=(s0+k-1)/k; vector<int>nc0,nc1; for(int j=b0*ns0;j<min((b0+1)*ns0,s0);j++)nc0.push_back(c0[j]); for(int j=b1*((s1+B-1)/k);j<min((b1+1)*((s1+B-1)/k),s1);j++)nc1.push_back(c1[j]); c0=nc0,c1=nc1; }else if(s0<=4&&s1<=4){ int i0=msg/s1,i1=msg%s1; return{c0[i0],c1[i1]}; }else{ int k=floor(sqrt(4.0*B+1)),b0=msg/k,b1=msg%k,ns=(s0+k-2)/k+1; vector<int>nc0,nc1; for(int j=b0*ns;j<min((b0+1)*ns,s0);j++)nc0.push_back(c0[j]); for(int j=b1*ns;j<min((b1+1)*ns,s1);j++)nc1.push_back(c1[j]); c0=nc0,c1=nc1; } cid++,cst=i+1; } } return{c0[0],c1[0]}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...