Submission #698631

#TimeUsernameProblemLanguageResultExecution timeMemory
698631azberjibiouThrough Another Maze Darkly (CCO21_day1problem3)C++17
25 / 25
1287 ms228744 KiB
#include <bits/stdc++.h>
#define gibon ios::sync_with_stdio(false); cin.tie(0);
#define fi first
#define se second
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(v) v.begin(), v.end()
typedef long long ll;
using namespace std;
const int mxN=800005;
struct fenwick{
    int siz;
    int fen[2*mxN];
    void upd(int idx, int val){while(idx<=siz) fen[idx]+=val, idx+=(idx&(-idx));}
    int sum(int idx)
    {
        int ret=0;
        while(idx)  ret+=fen[idx], idx-=(idx&(-idx));
        return ret;
    }
    int solv(int s, int e){return sum(e)-sum(s-1);}
};
ll N, Q;
vector <int> E[mxN], chd[mxN];
int par[mxN];
vector <int> ETT;
int M;
int in[mxN], out[mxN], dir[2*mxN];
fenwick F;
vector <pll> qry;
int ans[mxN];
void dfs1(int now, int pre)
{
    for(int nxt : E[now])   if(nxt!=pre)
    {
        par[nxt]=now;
        dfs1(nxt, now);
    }
}
void dfs2(int now)
{
    for(int nxt : chd[now])
    {
        ETT.push_back(nxt);
        in[nxt]=(int)ETT.size()-1;
        dfs2(nxt);
        ETT.push_back(now);
        out[nxt]=(int)ETT.size()-1;
    }
}
int main()
{
    gibon
    cin >> N >> Q;
    for(int i=1;i<=N;i++)
    {
        int c;  cin >> c;
        E[i].resize(c);
        for(int &x : E[i])  cin >> x;
    }
    ///----make child
    dfs1(1, -1);
    chd[1]=E[1];
    for(int i=2;i<=N;i++)
    {
        int idx;
        for(int j=0;j<E[i].size();j++)  if(par[i]==E[i][j]) idx=j;
        for(int j=idx+1;j<E[i].size();j++)  chd[i].push_back(E[i][j]);
        for(int j=0;j<idx;j++)  chd[i].push_back(E[i][j]);
    }
    ///---make ETT
    ETT.push_back(-1);
    dfs2(1);
    M=ETT.size()-1;

    ///---make dir / fenwick tree
    F.siz=M;
    if(E[1].size()==1)  dir[M]=in[E[1][0]];
    else    dir[M]=in[E[1][1]];
    F.upd(M, 1);
    for(int i=2;i<=N;i++)
    {
        int nxt=(E[i].size()==1 ? E[i][0] : E[i][1]);
        if(nxt!=par[i]) dir[in[i]]=in[nxt];
        else    dir[in[i]]=out[i];
        F.upd(in[i], 1);
    }
    ///---get query
    qry.resize(Q);
    for(int i=0;i<Q;i++)
    {
        cin >> qry[i].fi;
        qry[i].se=i;
    }
    sort(all(qry));
    int qi=0;
    ll K=0;
    ll now=M;
    ///---sweeping
    while(qi!=Q)
    {
        if(F.solv(now, now)==1)
        {
            F.upd(now, -1);
            now=dir[now];
            K++;
            while(qi!=Q && qry[qi].fi==K)
            {
                ans[qry[qi].se]=ETT[now];
                qi++;
            }
            continue;
        }
        if(now==M)
        {
            now=1;
            K++;
            while(qi!=Q && qry[qi].fi==K)
            {
                ans[qry[qi].se]=ETT[now];
                qi++;
            }
            continue;
        }
        if(now==1 && F.solv(1, M)==0)
        {
            while(qi!=Q)
            {
                auto [x, id]=qry[qi];
                ans[id]=ETT[(x-K)%M+1];
                qi++;
            }
            break;
        }
        int s=now+1, e=M-1;
        if(F.solv(now, M-1)==0)   e=M;
        else
        {
            while(s!=e)
            {
                int mid=(s+e)/2;
                if(F.solv(now, mid)==0) s=mid+1;
                else    e=mid;
            }
        }
        while(qi!=Q && qry[qi].fi<=K+e-now)
        {
            auto [x, id]=qry[qi];
            ans[id]=ETT[(x-K)+now];
            qi++;
        }
        K+=e-now;
        now=e;
    }
    for(int i=0;i<Q;i++)    cout << ans[i] << '\n';
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:67:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |         for(int j=0;j<E[i].size();j++)  if(par[i]==E[i][j]) idx=j;
      |                     ~^~~~~~~~~~~~
Main.cpp:68:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         for(int j=idx+1;j<E[i].size();j++)  chd[i].push_back(E[i][j]);
      |                         ~^~~~~~~~~~~~
Main.cpp:68:17: warning: 'idx' may be used uninitialized in this function [-Wmaybe-uninitialized]
   68 |         for(int j=idx+1;j<E[i].size();j++)  chd[i].push_back(E[i][j]);
      |                 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...