답안 #698631

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
698631 2023-02-14T06:16:35 Z azberjibiou Through Another Maze Darkly (CCO21_day1problem3) C++17
25 / 25
1287 ms 228744 KB
#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

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]);
      |                 ^
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 37844 KB Output is correct
2 Correct 29 ms 40292 KB Output is correct
3 Correct 115 ms 61408 KB Output is correct
4 Correct 659 ms 224876 KB Output is correct
5 Correct 928 ms 228744 KB Output is correct
6 Correct 807 ms 228496 KB Output is correct
7 Correct 280 ms 81892 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 37916 KB Output is correct
2 Correct 21 ms 37972 KB Output is correct
3 Correct 22 ms 38100 KB Output is correct
4 Correct 23 ms 38152 KB Output is correct
5 Correct 20 ms 38204 KB Output is correct
6 Correct 21 ms 38092 KB Output is correct
7 Correct 21 ms 38100 KB Output is correct
8 Correct 22 ms 38312 KB Output is correct
9 Correct 23 ms 38200 KB Output is correct
10 Correct 22 ms 38228 KB Output is correct
11 Correct 21 ms 38228 KB Output is correct
12 Correct 23 ms 38316 KB Output is correct
13 Correct 22 ms 38364 KB Output is correct
14 Correct 21 ms 38292 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 39248 KB Output is correct
2 Correct 44 ms 44760 KB Output is correct
3 Correct 91 ms 52916 KB Output is correct
4 Correct 104 ms 48536 KB Output is correct
5 Correct 606 ms 116620 KB Output is correct
6 Correct 662 ms 118896 KB Output is correct
7 Correct 650 ms 119504 KB Output is correct
8 Correct 670 ms 126352 KB Output is correct
9 Correct 788 ms 155656 KB Output is correct
10 Correct 790 ms 168924 KB Output is correct
11 Correct 564 ms 197500 KB Output is correct
12 Correct 425 ms 197592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 37844 KB Output is correct
2 Correct 29 ms 40292 KB Output is correct
3 Correct 115 ms 61408 KB Output is correct
4 Correct 659 ms 224876 KB Output is correct
5 Correct 928 ms 228744 KB Output is correct
6 Correct 807 ms 228496 KB Output is correct
7 Correct 280 ms 81892 KB Output is correct
8 Correct 24 ms 37916 KB Output is correct
9 Correct 21 ms 37972 KB Output is correct
10 Correct 22 ms 38100 KB Output is correct
11 Correct 23 ms 38152 KB Output is correct
12 Correct 20 ms 38204 KB Output is correct
13 Correct 21 ms 38092 KB Output is correct
14 Correct 21 ms 38100 KB Output is correct
15 Correct 22 ms 38312 KB Output is correct
16 Correct 23 ms 38200 KB Output is correct
17 Correct 22 ms 38228 KB Output is correct
18 Correct 21 ms 38228 KB Output is correct
19 Correct 23 ms 38316 KB Output is correct
20 Correct 22 ms 38364 KB Output is correct
21 Correct 21 ms 38292 KB Output is correct
22 Correct 25 ms 39248 KB Output is correct
23 Correct 44 ms 44760 KB Output is correct
24 Correct 91 ms 52916 KB Output is correct
25 Correct 104 ms 48536 KB Output is correct
26 Correct 606 ms 116620 KB Output is correct
27 Correct 662 ms 118896 KB Output is correct
28 Correct 650 ms 119504 KB Output is correct
29 Correct 670 ms 126352 KB Output is correct
30 Correct 788 ms 155656 KB Output is correct
31 Correct 790 ms 168924 KB Output is correct
32 Correct 564 ms 197500 KB Output is correct
33 Correct 425 ms 197592 KB Output is correct
34 Correct 259 ms 65276 KB Output is correct
35 Correct 308 ms 72500 KB Output is correct
36 Correct 340 ms 82616 KB Output is correct
37 Correct 1128 ms 144876 KB Output is correct
38 Correct 1183 ms 147284 KB Output is correct
39 Correct 1167 ms 148700 KB Output is correct
40 Correct 1234 ms 155424 KB Output is correct
41 Correct 1287 ms 189240 KB Output is correct
42 Correct 1217 ms 228648 KB Output is correct
43 Correct 941 ms 227680 KB Output is correct
44 Correct 782 ms 227576 KB Output is correct
45 Correct 940 ms 190300 KB Output is correct
46 Correct 21 ms 37908 KB Output is correct