제출 #1186692

#제출 시각아이디문제언어결과실행 시간메모리
1186692browntoadJail (JOI22_jail)C++20
61 / 100
5098 ms74308 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n) 
#define REP1(i, n) FOR(i, 1, n+1)
#define RREP(i, n) for (int i = (n)-1; i >= 0; i--)
#define pii pair<int, int>
#define f first
#define s second
#define pb push_back
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) (int)((x).size())
#define endl '\n'
#define IOS() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

const ll maxn = 5e5+5;
const ll mod = 1e9+7;
const ll inf = 1ll<<60;

ll pw(ll a, ll p){
    ll rt = 1;
    while(p > 0){
        if (p & 1){
            rt *= a;
            rt %= mod;
        }
        a *= a;
        a %= mod;
        p >>= 1;
    }
    return rt;
}
ll inv(int a){
    return pw(a, mod-2);
}

int n1, n2;
vector<int> g[maxn], g2[maxn];
vector<pii> qqs; 
vector<pii> euler(maxn);

vector<int> in(maxn), occ(maxn), dep(maxn);

const int mxpw = 18;
int up[maxn][mxpw];
bool ispar(int p, int u){
    return euler[p].f <= euler[u].f && euler[u].s <= euler[p].s;
}

int cval = 0;
int lca(int a, int b){
    if (dep[a] < dep[b]) swap(a, b);
    int tmp = dep[a] - dep[b];
    REP(i, mxpw){
        if ((1<<i)&tmp) a = up[a][i];
    }
    if (a == b) return a;
    RREP(i, mxpw){
        if (up[a][i] != up[b][i]){
            a = up[a][i];
            b = up[b][i];
        }
    }
    return up[a][0];
}
bool check(int a, int b, int tst){
    int lab = lca(a, b);
    //cout<<a<<' '<<b<<' '<<lab<<endl;
    if (!ispar(lab, tst)) return 0;
    return ispar(tst, a) || ispar(tst, b);
}
void dfs(int u, int pre){
    euler[u].f = cval++;
    up[u][0] = max(pre, 1ll);
    REP1(i, mxpw-1) up[u][i] = up[up[u][i-1]][i-1];
    for (auto v:g[u]){
        if (v == pre) continue;
        dep[v] = dep[u]+1;
        dfs(v, u);
    }
    euler[u].s = cval++;
}

void init(){
    cin>>n1;
    REP1(i, n1) {
        g[i].clear();
        euler[i] = {-1, -1};
    }
    REP(i, n1-1){
        int u, v; cin>>u>>v;
        g[u].pb(v); g[v].pb(u);
    }
    cin>>n2;
    REP(i, n2) {
        g2[i].clear();
        in[i] = 0;
        occ[i] = 0;
    }
    qqs.clear();
    REP(i, n2){
        int a, b; cin>>a>>b;
        qqs.pb({a, b});
    }
    cval = 1;
}
signed main(){
    IOS();
    int Q; cin>>Q;
    while(Q--){
        init();
        dfs(1, -1);

        REP(i, n2){
            REP(j, n2){
                if (i == j) continue;
                if (check(qqs[i].f, qqs[i].s, qqs[j].f)){
                    g2[j].pb(i);
                    //cout<<j<<'e'<<i<<endl;
                    in[i]++;
                }
                if (check(qqs[i].f, qqs[i].s, qqs[j].s)){
                    g2[i].pb(j);
                    in[j]++;
                    //cout<<i<<'e'<<j<<endl;
                }
            }
        }
        queue<int> qu;
        REP(i, n2){
            if (in[i] == 0){
                qu.push(i);
            }
        }
        while(SZ(qu)){
            int tp = qu.front(); qu.pop();
            occ[tp] = 1;
            for (auto v:g2[tp]){
                in[v]--;
                if (in[v] == 0) qu.push(v);
            }
        }
        bool ex = 0;
        REP(i, n2) if (occ[i] == 0) ex = 1;
        cout<<(ex?"No":"Yes")<<endl;
    }

}
#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...