Submission #709990

#TimeUsernameProblemLanguageResultExecution timeMemory
709990GrandTiger1729Jail (JOI22_jail)C++17
5 / 100
5035 ms32140 KiB
#include <iostream>
#include <vector>
#include <functional>
using namespace std;

int main(){
    cin.tie(0)->sync_with_stdio(0);
    int t; cin >> t;
    while (t--){
        int n; cin >> n;
        vector<vector<int>> g(n);
        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);
        }
        vector<bool> vis(n);
        vector<int> dep(n);
        vector<vector<int>> up(n, vector<int>(__lg(n) + 1));
        function<void(int)> dfs = [&](int u){
            vis[u] = 1;
            for (auto &v: g[u]){
                if (vis[v]) continue;
                up[v][0] = u;
                dep[v] = dep[u] + 1;
                dfs(v);
            }
            vis[u] = 0;
        };
        dfs(0);
        for (int j = 1; j <= __lg(n); j++){
            for (int i = 0; i < n; i++){
                up[i][j] = up[up[i][j - 1]][j - 1];
            }
        }
        auto lca = [&](int u, int v){
            if (dep[u] < dep[v]) swap(u, v);
            for (int i = __lg(n); i >= 0; i--){
                if (dep[up[u][i]] >= dep[v]){
                    u = up[u][i];
                }
            }
            if (u == v) return u;
            for (int i = __lg(n); i >= 0; i--){
                if (up[u][i] != up[v][i]){
                    u = up[u][i];
                    v = up[v][i];
                }
            }
            return up[u][0];
        };
        vector<pair<int, int>> tag(n);
        for (int i = 0; i < n; i++){
            tag[i] = make_pair(i, i);
        }
        int q; cin >> q;
        vector<pair<int, int>> qry(q);
        for (int i = 0; i < q; i++){
            int u, v; cin >> u >> v;
            u--, v--;
            qry[i] = make_pair(u, v);
        }
        auto dis = [&](int u, int v){
            return dep[u] + dep[v] - 2 * dep[lca(u, v)];
        };
        bool flag = 0;
        for (int i = 0; i < q; i++){
            auto &[u, v] = qry[i];
            for (int j = i + 1; j < q; j++){
                auto &[uu, vv] = qry[j];
                if (dis(u, uu) + dis(uu, v) == dis(u, v) && dis(u, vv) + dis(vv, v) == dis(u, v))
                    flag = 1;
                if (dis(uu, u) + dis(u, vv) == dis(uu, vv) && dis(uu, v) + dis(v, vv) == dis(uu, vv))
                    flag = 1;
                if (dis(u, uu) + dis(uu, v) == dis(u, v) && dis(uu, u) + dis(u, vv) == dis(uu, vv))
                    flag = 1;
                if (dis(u, vv) + dis(vv, v) == dis(u, v) && dis(uu, v) + dis(v, vv) == dis(uu, vv))
                    flag = 1;
            }
        }
        cout << (!flag? "Yes": "No") << '\n';
        /*
        while (q--){
            int u, v; cin >> u >> v;
            u--, v--;
            int l = lca(u, v);
            if (dep[l] < dep[tag[u].first]){
                tag[u].first = l;
            }
            if (dep[l] < dep[tag[v].second]){
                tag[v].second = l;
            }
        }
        // cout << endl;
        // for (int i = 0; i < n; i++){
        //     cout << tag[i].first << ' ' << tag[i].second << endl;
        // }
        // cout << endl;
        bool flag = 0;
        function<void(int)> solve = [&](int u){
            vis[u] = 1;
            pair<int, int> res{u, u};
            for (auto &v: g[u]){
                if (vis[v]) continue;
                solve(v);
                if (dep[tag[v].first] <= dep[u] && dep[tag[v].second] <= dep[u])
                    flag = 1;
                if ((tag[u].first != u && dep[tag[v].first] < dep[tag[u].first]) \
                         || (tag[u].second != u && dep[tag[v].second] < dep[tag[u].second]))
                    flag = 1;
                if (dep[tag[v].first] <= dep[res.first])
                    res.first = tag[v].first;
                if (dep[tag[v].second] <= dep[res.second])
                    res.second = tag[v].second;
            }
            if (dep[res.first] <= dep[tag[u].first])
                tag[u].first = res.first;
            if (dep[res.second] <= dep[tag[u].second])
                tag[u].second = res.second;
            vis[u] = 0;
        };
        solve(0);
        cout << (!flag? "Yes": "No") << '\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...