제출 #966769

#제출 시각아이디문제언어결과실행 시간메모리
966769LOLOLOJail (JOI22_jail)C++17
49 / 100
5068 ms320516 KiB
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
#define           f    first
#define           s    second
#define           pb    push_back
#define           ep    emplace
#define           eb    emplace_back
#define           lb    lower_bound
#define           ub    upper_bound
#define       all(x)    x.begin(), x.end()
#define      rall(x)    x.rbegin(), x.rend()
#define   uniquev(v)    sort(all(v)), (v).resize(unique(all(v)) - (v).begin())
#define     mem(f,x)    memset(f , x , sizeof(f))
#define        sz(x)    (int)(x).size()
#define  __lcm(a, b)    (1ll * ((a) / __gcd((a), (b))) * (b))
#define          mxx    *max_element
#define          mnn    *min_element
#define    cntbit(x)    __builtin_popcountll(x)
#define       len(x)    (int)(x.length())
 
const int N = 1.25e5;
vector <int> ed[N], ed2[N * 40];
int in[N], ou[N], dfstimer = 1, p[N][20], vi[N][20], vo[N][20], dep[N], st[N], en[N], cnt = 0;
char used[N * 40];
 
bool check_cycle(int u) {
    if (used[u] == 1)
        return 0;
 
    used[u] = 1; 
    for (auto x : ed2[u]) {
        if (used[x] != 2 && !check_cycle(x))
            return 0;
    }
 
    used[u] = 2;
    return 1;
}
 
void dfs(int u, int v) {
    vi[u][0] = ++cnt;
    vo[u][0] = ++cnt;
    if (st[u]) {
        ed2[st[u]].pb(vo[u][0]);
    }
 
    if (en[u]) {
        ed2[vi[u][0]].pb(en[u]);
    }
 
    dep[u] = dep[v] + 1;
    p[u][0] = v;
 
    for (int i = 1; i < 20; i++) {
        p[u][i] = p[p[u][i - 1]][i - 1];
        vi[u][i] = ++cnt;
        vo[u][i] = ++cnt;
        ed2[vo[u][i - 1]].pb(vo[u][i]);
        ed2[vo[p[u][i - 1]][i - 1]].pb(vo[u][i]);
        ed2[vi[u][i]].pb(vi[u][i - 1]);
        ed2[vi[u][i]].pb(vi[p[u][i - 1]][i - 1]);
    }
 
    ++dfstimer;
    in[u] = dfstimer;
    for (auto x : ed[u]) {
        if (x == v)
            continue;
 
        dfs(x, u);
    }
 
    ou[u] = dfstimer;
}
 
bool is(int a, int b) {
    return in[a] <= in[b] && ou[a] >= in[b]; 
}
 
int lca(int a, int b) {
    if (is(a, b))
        return a;
 
    if (is(b, a))
        return b;
 
    for (int i = 19; i >= 0; i--)
        if (is(p[a][i], b) == 0)
            a = p[a][i];
 
    return p[a][0];
}
 
int dis(int a, int b) {
    int c = lca(a, b);
    return dep[a] + dep[b] - dep[c] * 2;
}
 
void addedge(int a, int b, int id) {
    int k = dep[a] - dep[b] + 1;
    for (int j = 0; j < 20; j++) {
        if (k & (1 << j)) {
            ed2[id].pb(vi[a][j]);
            ed2[vo[a][j]].pb(id);
            a = p[a][j];
        }
    }
}
 
int find(int a, int k) {
    for (int j = 0; j < 20; j++)
        if (k & (1 << j))
            a = p[a][j];
 
    return a;
}
 
string solve() {
    int n;
    cin >> n;
 
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        ed[a].pb(b);
        ed[b].pb(a);
    }
 
    int m;
    cin >> m;
 
    vector <pair <int, int>> save;
 
    for (int i = 1; i <= m; i++) {
        int s, t;
        cin >> s >> t;
        save.pb({s, t});
        st[s] = i, en[t] = i;
    }
 
    cnt = m;
    dfs(1, 1);
 
    int id = 0;
    for (auto x : save) {
        id++;
        int s = x.f, t = x.s;
 
        int a = s, b = t;
        if (dep[s] > dep[t])
            swap(s, t);
 
        //int c = lca(s, t);
        /*if (s == c) {
            addedge(p[t][0], find(t, dep[t] - dep[s] - 1), id);
        } else {
            addedge(p[s][0], c, id);
            addedge(p[t][0], c, id);
        }*/
 
        for (int i = 1; i <= n; i++) {
            if (i == a || i == b)
                continue;        
 
            if (dis(i, a) + dis(i, b) == dis(a, b)) {
                if (st[i]) {
                    ed2[st[i]].pb(id);
                    ed2[st[i]].pb(id);
                }
 
                if (en[i]) {
                    ed2[id].pb(en[i]);
                    ed2[id].pb(en[i]);
                }
            } 
        }
 
        if (en[a]) {
            ed2[id].pb(en[a]);
            ed2[id].pb(en[a]);
        }
 
        if (st[b]) {
            ed2[st[b]].pb(id);
            ed2[st[b]].pb(id);
        }
    }
 
    int is = 0;
    for (int i = 1; i <= m; i++) {
        if (used[i] == 0 && check_cycle(i) == 0) {
            is = 1;
            break;
        }
    }
 
    for (int i = 1; i <= n; i++) {
        ed[i].clear();
        st[i] = en[i] = dep[i] = 0;
    }
 
    for (int i = 1; i <= cnt; i++) {
        ed2[i].clear();
        used[i] = 0;
    }
 
    if (is == 0)
        return "Yes";
 
    return "No";
}
 
int main(){
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);
    cout.tie(NULL);
 
    int t = 1;
    cin >> t;
 
    while (t--) {
        //solve();
        cout << solve() << "\n";
    }
 
    return 0;
}
#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...