Submission #890950

#TimeUsernameProblemLanguageResultExecution timeMemory
890950vjudge1Jail (JOI22_jail)C++17
26 / 100
5084 ms8788 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(), x.end()
#define size(x) (int)x.size()

template<class S, class T>
bool chmin(S &a, const T &b) {
    return a > b && (a = b) == b;
}
template<class S, class T>
bool chmax(S &a, const T &b) {
    return a < b && (a = b) == b;
}
const int inf = 1e9 + 7;
const int INF = 1e18 + 7;
const int mod = 998244353;

void Main() {
    int n;
    cin >> n;
    vector<int> g[n];
    bool bamboo = true;
    for (int i = 1; i < n; ++i) {
        int a, b;
        cin >> a >> b;
        a--, b--;
        if (b != a + 1) {
            bamboo = false;
        }
        g[a].push_back(b);
        g[b].push_back(a);
    }
    if (bamboo) {
        vector<bool> used(n, false);
        bool flag = true;
        deque<pair<int, int>> l, r;
        int m;
        cin >> m;
        while (m--) {
            int s, t;
            cin >> s >> t;
            s--, t--;
            if (t > s) {
                r.push_back({t, s});
            } else {
                l.push_back({t, s});
            }
            used[s] = true;
        }
        sort(all(l)), sort(all(r));
        while (!l.empty()) {
            int s = l.front().second, t = l.front().first;
            l.pop_front();
            used[s] = false;
            while (s >= t) {
                if (used[s]) {
                    flag = false;
                    break;
                }
                s--;
            }
            used[t] = true;
        }
        while (!r.empty()) {
            int s = r.back().second, t = r.back().first;
            r.pop_back();
            used[s] = false;
            while (s <= t) {
                if (used[s]) {
                    flag = false;
                    break;
                }
                s++;
            }
            used[t] = true;
        }
        cout << (flag ? "Yes" : "No") << '\n';
    } else {
        int m;
        cin >> m;
        vector<vector<int>> path;
        vector<int> p(n, -1);
        vector<bool> vis(n);
        function<void(int, int)> dfs = [&](int v, int parent) {
            for (int to : g[v]) {
                if (to != parent) {
                    p[to] = v;
                    dfs(to, v);
                }
            }
        };
        while (m--) {
            int s, t;
            cin >> s >> t;
            s--, t--;
            vis[s] = true;
            dfs(s, -1);
            vector<int> cur;
            int x = t;
            while (x != -1) {
                cur.push_back(x);
                x = p[x];
            }
            reverse(all(cur));
            path.push_back(cur);
            fill(all(p), -1);
        }
        sort(all(path));
        bool flag = false;
        do {
            bool cur = true;
            auto used = vis;
            for (auto way : path) {
                used[way[0]] = false;
                for (int v : way) {
                    if (used[v]) {
                        cur = false;
                        break;
                    }
                }
                used[way.back()] = true;
            }
            flag |= cur;
        } while (next_permutation(all(path)));
        cout << (flag ? "Yes" : "No") << '\n';
    }
}

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int q;
    cin >> q;
    while (q--) {
        Main();
    }
}
#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...