| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1026009 | Unforgettablepl | Flights (JOI22_flights) | C++17 | 8 ms | 1448 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "Ali.h"
#include <bits/stdc++.h>
using namespace std;
const int THRESHOLD = 7;
const int BLOCKS = 1429;
const int BLOCKSIZE = 13;
namespace {
vector<vector<int>> adj;
vector<int> subsize;
vector<int> root;
vector<int> depth;
vector<int> whichblock;
vector<int> whichinter;
vector<int> p;
int n;
}
void Init(int N, vector<int> U, vector<int> V) {
    adj = vector<vector<int>>(N);
    n = N;
    for(int i=0;i<n-1;i++){
        adj[U[i]].emplace_back(V[i]);
        adj[V[i]].emplace_back(U[i]);
    }
    vector<int> indegree(N);
    p = vector<int>(N);
    depth = vector<int>(N);
    whichblock = vector<int>(N);
    whichinter = vector<int>(N);
    function<void(int,int)> dfs = [&](int x,int dep){
        depth[x]=dep;
        for(int&i:adj[x])if(i!=p[x]){
            p[i]=x;indegree[x]++;
            dfs(i,dep+1);
        }
    };
    int roott;
    for(int i=0;i<N;i++)if(adj[i].size()<3){
        p[i]=-1;
        roott = i;
        dfs(i,1);
        break;
    }
    queue<int> q;
    subsize = vector<int>(N);
    for(int i=0;i<N;i++)if(indegree[i]==0)q.emplace(i);
    while(!q.empty()){
        auto curr = q.front();q.pop();
        subsize[curr] = 1;
        for(int&i:adj[curr])if(i!=p[curr] and subsize[i]<THRESHOLD)subsize[curr]+=subsize[i];
        if(p[curr]==-1)continue;
        if(--indegree[p[curr]]==0)q.emplace(p[curr]);
    }
    root = vector<int>();
    int blocks = 0;
    subsize[roott]=THRESHOLD;
    function<int(int,int,int)> numdfs = [&](int x,int blockid,int interid){
        if(THRESHOLD<=subsize[x]){
            blockid = blocks++;
            interid = 0;
            root.emplace_back(x);
        }
        SetID(x,blockid*BLOCKSIZE+interid);
        whichblock[x] = blockid;
        whichinter[x] = interid;
        int allocated = 1;
        for(int&i:adj[x])if(i!=p[x]){
            allocated += numdfs(i,blockid,interid+allocated);
        }
        if(THRESHOLD<=subsize[x])return 0;
        else return allocated;
    };
    numdfs(roott,-1,-1);
}
string SendA(string S) {
    int rex = 0;
    for(int bit=0;bit<20;bit++)if(S[bit]=='1')rex|=(1<<bit);
    int curr = 0;
    int A,B;
    for(int l=0;l<BLOCKS;l++){
        for(int r=l;r<BLOCKS;r++){
            if(curr++==rex){A=l;B=r;}
        }
    }
    string res;
    int interid;
    function<void(int)> senddfs = [&](int x){
        if(interid==BLOCKSIZE-1)return;
        for(int i=0;i<adj[x].size();i++)if(adj[x][i]==p[x])adj[x].erase(adj[x].begin()+i);
        if(adj[x].empty() or subsize[adj[x][0]]>=THRESHOLD)res.insert(res.end(),'0');
        else {
            res.insert(res.end(),'1');
            interid++;
            senddfs(adj[x][0]);
        }
        if(adj[x].size()<2 or subsize[adj[x][1]]>=THRESHOLD)res.insert(res.end(),'0');
        else {
            res.insert(res.end(),'1');
            interid++;
            senddfs(adj[x][1]);
        }
    };
    if(depth[root[A]]>depth[root[B]]){
        res.insert(res.end(),'1');
        swap(A,B);
    } else res.insert(res.end(),'0');
    int rooter = 0;
    int tempB = root[B];
    while(tempB!=-1 and whichblock[tempB]!=A)tempB=p[tempB];
    if(tempB!=-1)rooter = whichinter[tempB];
    for(int bit=0;bit<4;bit++)if(rooter&(1<<bit))res.insert(res.end(),'1');
                              else res.insert(res.end(),'0');
    {
        int tar = A*BLOCKSIZE + rooter;
        function<int(int,int)> dfs = [&](int x,int p){
            if(tar==x)return 0;
            int ans = 1e5;
            for(int&i:adj[x])if(i!=p)ans=min(ans,dfs(i,x)+1);
            return ans;
        };
        int ans = dfs(root[B],-1);
        for(int bit=0;bit<14;bit++)if(ans&(1<<bit))res.insert(res.end(),'1');
                                  else res.insert(res.end(),'0');
    }
    interid = 0;
    senddfs(root[A]);
    interid = 0;
    senddfs(root[B]);
    return res;
}
#include "Benjamin.h"
#include <bits/stdc++.h>
using namespace std;
const int THRESHOLD = 7;
const int BLOCKS = 1429;
const int BLOCKSIZE = 13;
namespace {
int x,y;
}
string SendB(int N, int X, int Y) {
    if(X>Y)swap(X,Y);
    ::x = X;
    ::y = Y;
    X/=BLOCKSIZE;
    Y/=BLOCKSIZE;
    int ans;
    int curr = 0;
    for(int l=0;l<BLOCKS;l++){
        for(int r=l;r<BLOCKS;r++){
            if(l==X and r==Y)ans = curr;
            curr++;
        }
    }
    string res;
    for(int bit=0;bit<20;bit++)if(ans&(1<<bit))res.insert(res.end(),'1');
                               else res.insert(res.end(),'0');
    return res;
}
int Answer(string T) {
    int ptrused = 0;
    auto read = [&]{
        return T[ptrused++]=='1';
    };
    if(read())swap(x,y);
    int rooter = 0;
    for(int bit=0;bit<4;bit++)if(read())rooter|=(1<<bit);    
    int maindist = 0;
    for(int bit=0;bit<14;bit++)if(read())maindist|=(1<<bit);    
    int blockX = x/BLOCKSIZE;
    int blockY = y/BLOCKSIZE;
    vector<vector<int>> adj1(BLOCKSIZE);
    vector<vector<int>> adj2(BLOCKSIZE);
    int alloc;
    function<void(int,vector<vector<int>>&)> readdfs = [&](int x,vector<vector<int>> &adj){
        if(read()){
            adj[x].emplace_back(++alloc);
            adj[alloc].emplace_back(x);
            readdfs(alloc,adj);
        }
        if(read()){
            adj[x].emplace_back(++alloc);
            adj[alloc].emplace_back(x);
            readdfs(alloc,adj);
        }
    };
    alloc = 0;
    readdfs(0,adj1);
    alloc = 0;
    readdfs(0,adj2);
    if(blockX==blockY){
        int tar = y%BLOCKSIZE;
        function<int(int,int)> dfs = [&](int x,int p){
            if(tar==x)return 0;
            int ans = 1e5;
            for(int&i:adj1[x])if(i!=p)ans=min(ans,dfs(i,x)+1);
            return ans;
        };
        return dfs(x%BLOCKSIZE,-1);
    }
    vector<int> dist1(BLOCKSIZE);
    vector<int> dist2(BLOCKSIZE);
    function<void(int,int,int,vector<vector<int>>&,vector<int>&)> depthdfs = [&](int x,int p,int depth,vector<vector<int>> &adj,vector<int> &dist){
        dist[x] = depth;
        for(int&i:adj[x])if(i!=p)depthdfs(i,x,depth+1,adj,dist);
    };
    depthdfs(rooter,-1,0,adj1,dist1);
    depthdfs(0,-1,0,adj2,dist2);
    return dist1[x%BLOCKSIZE]+dist2[y%BLOCKSIZE]+maindist;
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
