Submission #584766

#TimeUsernameProblemLanguageResultExecution timeMemory
584766azberjibiouJail (JOI22_jail)C++17
61 / 100
5057 ms26312 KiB
#include <bits/stdc++.h>
#define gibon ios::sync_with_stdio(false); cin.tie(0);
#define fir first
#define sec second
#define pdd pair<long double, long double>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ld long double
#define pmax pair<__int128, __int128>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
typedef long long ll;
typedef unsigned int uint;
using namespace std;
int dx[4]= {0, 1, 0, -1}, dy[4]= {1, 0, -1, 0};
int ddx[8]={1, 1, 0, -1, -1, -1, 0, 1}, ddy[8]={0, 1, 1, 1, 0, -1, -1, -1};
const int mxN=120005;
const int mxM=300005;
const int mxK=1000000000;
const int MOD=1e9+7;
const ll INF=1000000000000000005;
int N, M;
vector <int> v[mxN];
pii A[mxN];
vector <int> dag[mxN];
int dep[mxN];
int sps[mxN][20];
int deg[mxN];
queue <int> que;
void init()
{
    for(int i=1;i<=N;i++)   v[i].clear();
    for(int i=1;i<=M;i++)   dag[i].clear();
    for(int i=1;i<=M;i++)   deg[i]=0;
    while(que.size())   que.pop();
}
void dfs(int now, int pre)
{
    for(int nxt : v[now])   if(nxt!=pre)
    {
        dep[nxt]=dep[now]+1;
        sps[nxt][0]=now;
        dfs(nxt, now);
    }
}
void make_sparse()
{
    for(int z=1;z<20;z++)
    {
        for(int i=1;i<=N;i++)
        {
            sps[i][z]=sps[sps[i][z-1]][z-1];
        }
    }
}
int lca(int a, int b)
{
    if(dep[a]<dep[b])   swap(a, b);
    for(int i=19;i>=0;i--)
    {
        if(dep[a]-(1<<i)>=dep[b])   a=sps[a][i];
    }
    if(a==b)    return a;
    for(int i=19;i>=0;i--)
    {
        if(sps[a][i]!=sps[b][i])    a=sps[a][i], b=sps[b][i];
    }
    return sps[a][0];
}
bool on(int a, int b, int c)
{
    int lcaab=lca(a, b), lcaac=lca(a, c), lcabc=lca(b, c);
    if(lcabc==a)    return true;
    if(lcaab==a && lcaac==lcabc)    return true;
    if(lcaac==a && lcaab==lcabc)    return true;
    return false;
}
int main()
{
    gibon
    int T;
    cin >> T;
    while(T--)
    {
        cin >> N;
        for(int i=1;i<N;i++)
        {
            int a, b;
            cin >> a >> b;
            v[a].push_back(b);
            v[b].push_back(a);
        }
        dfs(1, -1);
        make_sparse();
        cin >> M;
        for(int i=1;i<=M;i++)   cin >> A[i].fir >> A[i].sec;
        for(int i=1;i<=M;i++)
        {
            for(int j=1;j<=M;j++)   if(i!=j)
            {
                if(on(A[j].fir, A[i].fir, A[i].sec))    dag[i].push_back(j), deg[j]++;
                if(on(A[j].sec, A[i].fir, A[i].sec))    dag[j].push_back(i), deg[i]++;
            }
        }
        int cnt=0;
        for(int i=1;i<=M;i++)   if(deg[i]==0)  que.push(i);
        while(que.size())
        {
            int now=que.front();
            que.pop();
            cnt++;
            for(int nxt : dag[now])
            {
                deg[nxt]--;
                if(!deg[nxt])   que.push(nxt);
            }
        }
        cout << (cnt==M ? "Yes" : "No") << '\n';
        init();
    }
}
#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...