답안 #567488

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
567488 2022-05-23T15:14:35 Z maomao90 Jail (JOI22_jail) C++17
5 / 100
2238 ms 641124 KB
// Hallelujah, praise the one who set me free
// Hallelujah, death has lost its grip on me
// You have broken every chain, There's salvation in your name
// Jesus Christ, my living hope
#include <bits/stdc++.h> 
using namespace std;

template <class T>
inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;}
template <class T>
inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;}
#define REP(i, s, e) for (int i = s; i < e; i++)
#define RREP(i, s, e) for (int i = s; i >= e; i--)
typedef long long ll;
typedef long double ld;
#define FI first
#define SE second
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> iii;
#define ALL(_a) _a.begin(), _a.end()
#define SZ(_a) (int) _a.size()
#define pb push_back
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<ii> vii;
typedef vector<iii> viii;

#ifndef DEBUG
#define cerr if (0) cerr
#endif

const int INF = 1000000005;
const ll LINF = 1000000000000000005ll;
const int MAXN = 200005;
const int MAXL = 20;

int q;
int n, m;
vi adj[MAXN], radj[MAXN * 80];
int s[MAXN], t[MAXN];
int mps[MAXN], mpt[MAXN];

int p[MAXL][MAXN], id[MAXL][MAXN], ptr;
int lvl[MAXN];
void dfs(int u, int cp) {
    p[0][u] = cp;
    REP (k, 1, MAXL) {
        if (p[k - 1][u] == -1) {
            p[k][u] = -1;
            id[k][u] = -1;
        } else {
            p[k][u] = p[k - 1][p[k - 1][u]];
            id[k][u] = ptr;
            radj[id[k - 1][u]].pb(id[k][u]);
            radj[id[k][u] ^ 1].pb(id[k - 1][u] ^ 1);
            if (id[k - 1][p[k - 1][u]] != -1) {
                radj[id[k - 1][p[k - 1][u]]].pb(id[k][u]);
                radj[id[k][u] ^ 1].pb(id[k - 1][p[k - 1][u]] ^ 1);
            }
            ptr += 2;
        }
    }
    for (int v : adj[u]) {
        if (v == cp) continue;
        lvl[v] = lvl[u] + 1;
        dfs(v, u);
    }
}

int vis[MAXN * 80];
bool cyc;
void rdfs(int u) {
    vis[u] = 1;
    for (int v : radj[u]) {
        if (vis[v] == 1) {
            cyc = 1;
        } else if (!vis[v]) {
            rdfs(v);
        }
    }
    vis[u] = 2;
}

int main() {
#ifndef DEBUG
    ios::sync_with_stdio(0), cin.tie(0);
#endif
    cin >> q;
    while (q--) {
        cin >> n;
        REP (i, 0, n + 1) {
            adj[i].clear();
            mps[i] = 0, mpt[i] = 0;
            REP (j, 0, MAXL) {
                id[j][i] = -1;
                p[j][i] = -1;
            }
        }
        REP (i, 1, n) {
            int a, b; cin >> a >> b;
            adj[a].pb(b);
            adj[b].pb(a);
        }
        cin >> m;
        ptr = m;
        if (ptr & 1) {
            ptr++;
        }
        REP (i, 1, n + 1) {
            id[0][i] = ptr;
            ptr += 2;
        }
        REP (i, 0, m) {
            cin >> s[i] >> t[i];
            mps[s[i]] = i, mpt[t[i]] = i;
            radj[i].pb(id[0][s[i]]);
            radj[id[0][t[i]] ^ 1].pb(i);
        }
        dfs(1, -1);
        REP (i, 0, m) {
            int u = s[i], v = t[i];
            if (mpt[u] != 0) {
                radj[i].pb(mpt[u]);
            }
            if (mps[v] != 0) {
                radj[mps[v]].pb(i);
            }
            if (lvl[u] < lvl[v]) {
                swap(u, v);
            }
            auto jump = [&] (int &u, int k) {
                assert(u == 0 || id[k][u] != 0);
                assert(id[k][u] != -1);
                radj[id[k][u]].pb(i);
                radj[i].pb(id[k][u] ^ 1);
                u = p[k][u];
            };
            u = p[0][u];
            RREP (k, MAXL - 1, 0) {
                if (p[k][u] == -1) continue;
                if (lvl[p[k][u]] >= lvl[v]) {
                    jump(u, k);
                }
            }
            bool hasj = 0;
            if (lvl[u] < lvl[v]) {
                hasj = 1;
                v = p[0][v];
            }
            if (u == v) {
                continue;
            }
            if (hasj) {
                jump(v, 0);
            } else {
                v = p[0][v];
            }
            jump(u, 0);
            RREP (k, MAXL - 1, 0) {
                if (p[k][u] != p[k][v]) {
                    jump(u, k);
                    jump(v, k);
                }
            }
            if (u != v) {
                jump(u, 0); jump(v, 0);
            }
            jump(u, 0);
        }
        cyc = 0;
        REP (i, 0, m) {
            if (vis[i]) continue;
            rdfs(i);
            if (cyc) {
                break;
            }
        }
        if (cyc) {
            cout << "No\n";
        } else {
            cout << "Yes\n";
        }
        REP (i, 0, ptr) {
            radj[i].clear();
            vis[i] = 0;
        }
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 192 ms 380904 KB Output is correct
2 Correct 180 ms 381104 KB Output is correct
3 Correct 185 ms 380984 KB Output is correct
4 Correct 208 ms 381160 KB Output is correct
5 Correct 237 ms 381004 KB Output is correct
6 Correct 187 ms 381088 KB Output is correct
7 Correct 193 ms 381096 KB Output is correct
8 Correct 196 ms 381288 KB Output is correct
9 Correct 486 ms 388036 KB Output is correct
10 Correct 1018 ms 553408 KB Output is correct
11 Correct 189 ms 380996 KB Output is correct
12 Correct 259 ms 381108 KB Output is correct
13 Correct 1284 ms 558044 KB Output is correct
14 Correct 1176 ms 558192 KB Output is correct
15 Correct 1750 ms 584528 KB Output is correct
16 Correct 2238 ms 641124 KB Output is correct
17 Correct 1467 ms 562492 KB Output is correct
18 Correct 1239 ms 562292 KB Output is correct
19 Correct 1399 ms 562456 KB Output is correct
20 Correct 1145 ms 562556 KB Output is correct
21 Correct 1441 ms 585168 KB Output is correct
22 Correct 1045 ms 557776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 202 ms 380944 KB Output is correct
2 Correct 178 ms 380888 KB Output is correct
3 Correct 185 ms 381152 KB Output is correct
4 Correct 196 ms 381304 KB Output is correct
5 Correct 183 ms 381068 KB Output is correct
6 Correct 181 ms 381168 KB Output is correct
7 Correct 183 ms 381132 KB Output is correct
8 Correct 194 ms 381160 KB Output is correct
9 Correct 181 ms 381132 KB Output is correct
10 Correct 181 ms 381068 KB Output is correct
11 Correct 181 ms 381368 KB Output is correct
12 Incorrect 192 ms 380992 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 202 ms 380944 KB Output is correct
2 Correct 178 ms 380888 KB Output is correct
3 Correct 185 ms 381152 KB Output is correct
4 Correct 196 ms 381304 KB Output is correct
5 Correct 183 ms 381068 KB Output is correct
6 Correct 181 ms 381168 KB Output is correct
7 Correct 183 ms 381132 KB Output is correct
8 Correct 194 ms 381160 KB Output is correct
9 Correct 181 ms 381132 KB Output is correct
10 Correct 181 ms 381068 KB Output is correct
11 Correct 181 ms 381368 KB Output is correct
12 Incorrect 192 ms 380992 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 202 ms 380944 KB Output is correct
2 Correct 178 ms 380888 KB Output is correct
3 Correct 185 ms 381152 KB Output is correct
4 Correct 196 ms 381304 KB Output is correct
5 Correct 183 ms 381068 KB Output is correct
6 Correct 181 ms 381168 KB Output is correct
7 Correct 183 ms 381132 KB Output is correct
8 Correct 194 ms 381160 KB Output is correct
9 Correct 181 ms 381132 KB Output is correct
10 Correct 181 ms 381068 KB Output is correct
11 Correct 181 ms 381368 KB Output is correct
12 Incorrect 192 ms 380992 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 202 ms 380944 KB Output is correct
2 Correct 178 ms 380888 KB Output is correct
3 Correct 185 ms 381152 KB Output is correct
4 Correct 196 ms 381304 KB Output is correct
5 Correct 183 ms 381068 KB Output is correct
6 Correct 181 ms 381168 KB Output is correct
7 Correct 183 ms 381132 KB Output is correct
8 Correct 194 ms 381160 KB Output is correct
9 Correct 181 ms 381132 KB Output is correct
10 Correct 181 ms 381068 KB Output is correct
11 Correct 181 ms 381368 KB Output is correct
12 Incorrect 192 ms 380992 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 185 ms 380992 KB Output is correct
2 Correct 200 ms 380916 KB Output is correct
3 Correct 186 ms 380928 KB Output is correct
4 Correct 187 ms 380936 KB Output is correct
5 Correct 196 ms 381072 KB Output is correct
6 Incorrect 199 ms 381024 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 192 ms 380904 KB Output is correct
2 Correct 180 ms 381104 KB Output is correct
3 Correct 185 ms 380984 KB Output is correct
4 Correct 208 ms 381160 KB Output is correct
5 Correct 237 ms 381004 KB Output is correct
6 Correct 187 ms 381088 KB Output is correct
7 Correct 193 ms 381096 KB Output is correct
8 Correct 196 ms 381288 KB Output is correct
9 Correct 486 ms 388036 KB Output is correct
10 Correct 1018 ms 553408 KB Output is correct
11 Correct 189 ms 380996 KB Output is correct
12 Correct 259 ms 381108 KB Output is correct
13 Correct 1284 ms 558044 KB Output is correct
14 Correct 1176 ms 558192 KB Output is correct
15 Correct 1750 ms 584528 KB Output is correct
16 Correct 2238 ms 641124 KB Output is correct
17 Correct 1467 ms 562492 KB Output is correct
18 Correct 1239 ms 562292 KB Output is correct
19 Correct 1399 ms 562456 KB Output is correct
20 Correct 1145 ms 562556 KB Output is correct
21 Correct 1441 ms 585168 KB Output is correct
22 Correct 1045 ms 557776 KB Output is correct
23 Correct 202 ms 380944 KB Output is correct
24 Correct 178 ms 380888 KB Output is correct
25 Correct 185 ms 381152 KB Output is correct
26 Correct 196 ms 381304 KB Output is correct
27 Correct 183 ms 381068 KB Output is correct
28 Correct 181 ms 381168 KB Output is correct
29 Correct 183 ms 381132 KB Output is correct
30 Correct 194 ms 381160 KB Output is correct
31 Correct 181 ms 381132 KB Output is correct
32 Correct 181 ms 381068 KB Output is correct
33 Correct 181 ms 381368 KB Output is correct
34 Incorrect 192 ms 380992 KB Output isn't correct
35 Halted 0 ms 0 KB -