제출 #1269851

#제출 시각아이디문제언어결과실행 시간메모리
1269851k12_khoiBitaro’s Party (JOI18_bitaro)C++17
100 / 100
1241 ms415296 KiB
#include <bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define X first
#define Y second

const int N=1e5+5;
const int oo=1e9+1;

int n,m,request,x,y,k;
int a[N],dp[N];
bool IsBusy[N];
vector <int> g[N];

namespace sub1
{
    void dfs(int u)
    {
        if (!IsBusy[u]) dp[u]=0;
        else dp[u]=-oo;
        for (int v:g[u])
        {
            if (dp[v]==-1) dfs(v);

            dp[u]=max(dp[u],dp[v]+1);
        }
    }

    void solve()
    {
        while (request--)
        {
            cin >> x >> k;
            for (int j=1;j<=k;j++)
            {
                cin >> a[j];

                IsBusy[a[j]]=true;
            }

            for (int i=1;i<=n;i++)
            dp[i]=-1;

            dfs(x);

            if (dp[x]<0) dp[x]=-1;

            cout << dp[x] << '\n';


            for (int j=1;j<=k;j++)
            IsBusy[a[j]]=false;
        }
    }
}

namespace sub3
{
    int S;
    bool ok,used[N];
    vector <pii> mx_dist[N];

    vector <pii> MergeDist(vector <pii> A,vector <pii> B)
    {
        vector <pii> C;
        C.clear();

        for (int i=0;i<B.size();i++)
        B[i].X++;

        int l=0;
        int r=0;

        while (C.size()<S and l<A.size() and r<B.size())
        {
            if (A[l].X>B[r].X)
            {
                if (!used[A[l].Y])
                {
                    C.push_back(A[l]);
                    used[A[l].Y]=true;
                }

                l++;
            }
            else
            {
                if (!used[B[r].Y])
                {
                    C.push_back(B[r]);
                    used[B[r].Y]=true;
                }
                r++;
            }
        }

        while (C.size()<S and l<A.size())
        {
            if (!used[A[l].Y])
            {
                C.push_back(A[l]);
                used[A[l].Y]=true;
            }
            l++;
        }

        while (C.size()<S and r<B.size())
        {
            if (!used[B[r].Y])
            {
                C.push_back(B[r]);
                used[B[r].Y]=true;
            }
            r++;
        }

        for (pii j:C)
        used[j.Y]=false;

        return C;
    }

    void pre_dfs(int u)
    {
        mx_dist[u].push_back(make_pair(0,u));
        for (int v:g[u])
        {
            if (mx_dist[v].size()==0) pre_dfs(v);

            mx_dist[u]=MergeDist(mx_dist[u],mx_dist[v]);
        }
    }

    void dfs(int u)
    {
        if (!IsBusy[u]) dp[u]=0;
        else dp[u]=-oo;
        for (int v:g[u])
        {
            if (dp[v]==-1) dfs(v);

            dp[u]=max(dp[u],dp[v]+1);
        }
    }

    void solve()
    {
        S=trunc(sqrt(n));

        for (int i=1;i<=n;i++)
        if (mx_dist[i].size()==0)
            pre_dfs(i);

        while (request--)
        {
            cin >> x >> k;
            for (int j=1;j<=k;j++)
            {
                cin >> a[j];
                IsBusy[a[j]]=true;
            }

            if (k>=S)
            {
                for (int i=1;i<=n;i++)
                dp[i]=-1;

                dfs(x);

                if (dp[x]<0) dp[x]=-1;

                cout << dp[x] << '\n';
            }
            else
            {
                ok=false;

                for (pii j:mx_dist[x])
                if (!IsBusy[j.Y])
                {
                    ok=true;
                    cout << j.X << '\n';
                    break;
                }

                if (!ok) cout << -1 << '\n';
            }

            for (int j=1;j<=k;j++)
            IsBusy[a[j]]=false;
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL); cout.tie(NULL);

    cin >> n >> m >> request;
    for (int i=1;i<=m;i++)
    {
        cin >> x >> y;
        g[y].push_back(x);
    }

    sub3::solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...