Submission #1135295

#TimeUsernameProblemLanguageResultExecution timeMemory
1135295ace5Jail (JOI22_jail)C++20
72 / 100
3302 ms1114112 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 120001;

int en[maxn];
int st[maxn];
vector<int> g[maxn];
vector<int> ng[maxn];
int par[maxn];
int tin[maxn],tout[maxn];
int times = 0;
bool isc = 0;
int vis[maxn];

void dfs1(int v,int p)
{
    par[v] = p;
    tin[v] = times++;
    for(auto u:g[v])
    {
        if(u != p)
        {
            dfs1(u,v);
        }
    }
    tout[v] = times++;
    return ;
}

void dfs2(int v,int p)
{
    vis[v] = 1;
    for(auto u:ng[v])
    {
        if(!vis[u])
        {
            dfs2(u,v);
        }
        else if(vis[u] == 1)
        {
            isc = 1;
        }

    }
    vis[v] = 2;
    return ;
}

bool isP(int u,int v)
{
    return tin[u] <= tin[v] && tout[v] <= tout[u];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int q;
    cin >> q;
    while(q--)
    {
        int n;
        cin >> n;
        times = 0;
        isc = 0;
        for(int i = 0;i < n;++i)
        {
            en[i] = -1;
            st[i] = -1;
            g[i].clear();
        }
        for(int i = 0;i < n-1;++i)
        {
            int u,v;
            cin >> u >> v;
            u--;
            v--;
            g[u].push_back(v);
            g[v].push_back(u);
        }
        dfs1(0,-1);
        int m;
        cin >> m;
        vector<pair<int,int>> ps;
        for(int i  =0;i < m;++i)
        {
            ng[i].clear();
        }
        for(int i = 0;i < m;++i)
        {
            int u,v;
            cin >> u >> v;
            u--;
            v--;
            ps.push_back({u,v});
            en[v] = i;
            st[u] = i;
        }
        for(int i = 0;i < m;++i)
        {
            int ui = ps[i].first,vi = ps[i].second;
            int u = ps[i].first,v = ps[i].second;
            while(!isP(u,v))
            {
                u = par[u];
              //  cout << u << endl;
                if(st[u] != -1 && u != vi)
                {
                    ng[i].push_back(st[u]);
                }
                if(en[u] != -1 && u != vi)
                {
                    ng[en[u]].push_back(i);
                }
            }
            if(st[v] != -1)
                ng[i].push_back(st[v]);
            while(!isP(v,u))
            {
                v = par[v];
                //cout << v << endl;
                if(st[v] != -1 && v != ui)
                {
                    ng[i].push_back(st[v]);
                }
                if(en[v] != -1 && v != ui)
                {
                    ng[en[v]].push_back(i);
                }
            }
        }
        for(int i = 0;i < m;++i)
        {
            vis[i] = 0;
        }
        for(int i = 0;i < m;++i)
        {
            if(!vis[i])
            {
                dfs2(i,-1);
            }
        }
        cout << (isc ? "No\n" : "Yes\n");
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...