Submission #551443

#TimeUsernameProblemLanguageResultExecution timeMemory
551443dooweyJail (JOI22_jail)C++14
100 / 100
2231 ms377044 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = 123456;
const int LOG = 18;
vector<int> T[N];

int par[N];
int go[LOG][N];
int S[N], E[N];
int ss[N], ee[N];
int tin[N];
int tout[N];
int dep[N];
int ti;

void dfs(int u, int pp){
    ti ++ ;
    tin[u] = ti;
    par[u] = pp;
    go[0][u] = pp;
    for(int i = 1; i < LOG; i ++ ){
        go[i][u]=go[i-1][go[i-1][u]];
    }
    for(auto x : T[u]){
        if(x == pp) continue;
        dep[x] = dep[u] + 1;
        dfs(x, u);

    }
    tout[u] = ti;
}

bool is_par(int u, int v){
    if(tin[u] <= tin[v] && tout[u] >= tout[v]) return true;
    return false;
}

int lca(int u, int v){
    if(is_par(u, v)) return u;
    for(int lg = LOG - 1; lg >= 0 ; lg -- ){
        if(!is_par(go[lg][u], v)) u = go[lg][u];
    }
    return go[0][u];
}

const int M = 40 * N;
vector<int> G[M];
int vis[M];

int n, m;

int get_id(int node, int v){
    return m + n * v + node;
}

void add_edge(int u, int v){
    G[u].push_back(v);
}

bool cycle;

void dfs1(int u){
    if(vis[u] == 1){
        cycle = true;
        return;
    }
    if(vis[u] == 2){
        return;
    }
    //convert(u);
    //cout << u << "!!\n";
    vis[u] = 1;
    for(auto x : G[u]){
        dfs1(x);
    }
    vis[u] = 2;
}

void solve(){
    cin >> n;
    for(int i = 1; i <= n; i ++ ){
        T[i].clear();
        G[i].clear();
        ss[i] = ee[i] = -1;
    }
    for(int j = 1; j <= 40 * n; j ++){
        G[j].clear();
        vis[j] = 0;
    }
    int u, v;
    for(int i = 1; i < n; i ++ ){
        cin >> u >> v;
        T[u].push_back(v);
        T[v].push_back(u);
    }
    ti = 0;
    dep[1] = 0;
    dfs(1, 1);
    cin >> m;
    for(int i = 1; i <= n; i ++ ){
        for(int j = 1; j < LOG; j ++ ){
            add_edge(get_id(i, j - 1), get_id(i, j));
            add_edge(get_id(go[j - 1][i], j - 1), get_id(i, j));
            // ------------
            add_edge(get_id(i, LOG + j), get_id(i, LOG + j - 1));
            add_edge(get_id(i, LOG + j), get_id(go[j - 1][i], LOG + j - 1));
        }
    }
    int lc;
    int pa;
    int nex;
    int dd;
    for(int i = 1; i <= m ; i ++ ){
        cin >> S[i] >> E[i];

        ss[S[i]] = i;
        ee[E[i]] = i;

        lc = lca(S[i], E[i]);
        add_edge(i, get_id(S[i], 0));
        if(S[i] != 1){
            pa = go[0][S[i]];
            dd = dep[pa] - dep[lc] + 1;
            for(int lg = LOG - 1; lg >= 0 ; lg -- ){
                if((dd & (1 << lg))){
                    add_edge(get_id(pa, lg), i);
                    pa = go[lg][pa];
                }
            }
        }
        pa = E[i];
        dd = dep[pa] - dep[lc] + 1;
        if(S[i] == lc) dd -- ;

        for(int lg = LOG - 1; lg >= 0 ; lg -- ){
            if((dd & (1 << lg))){
                add_edge(get_id(pa, lg), i);
                pa = go[lg][pa];
            }
        }

        // --------------
        add_edge(get_id(E[i], LOG), i);

        pa = S[i];
        dd = dep[pa] - dep[lc] + 1;
        if(E[i] == lc) dd -- ;
        for(int lg = LOG - 1; lg >= 0 ; lg -- ){
            if((dd & (1 << lg))){
                add_edge(i, get_id(pa, LOG + lg));
                pa = go[lg][pa];
            }
        }

        if(E[i] != 1){
            pa = go[0][E[i]];
            dd = dep[pa] - dep[lc] + 1;
            for(int lg = LOG - 1; lg >= 0 ; lg -- ){
                if((dd & (1 << lg))){
                    add_edge(i, get_id(pa, LOG + lg));
                    pa = go[lg][pa];
                }
            }
        }



    }
    //return;
    cycle = false;
    for(int i = 1; i <= 40 * n; i ++ ){
        dfs1(i);
    }
    if(cycle){
        cout << "No\n";
    }
    else{
        cout << "Yes\n";
    }

}

int main(){
    fastIO;
    //freopen("in.txt","r",stdin);
    int tc;
    cin >> tc;
    for(int iq = 1; iq <= tc; iq ++ ){
        solve();
    }
    return 0;
}

Compilation message (stderr)

jail.cpp: In function 'void solve()':
jail.cpp:121:9: warning: unused variable 'nex' [-Wunused-variable]
  121 |     int nex;
      |         ^~~
#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...