Submission #961204

#TimeUsernameProblemLanguageResultExecution timeMemory
961204huutuanJail (JOI22_jail)C++14
61 / 100
5044 ms54004 KiB
#include<bits/stdc++.h>

using namespace std;

// #define int long long
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define isz(x) ((int)x.size())
#define sumof(x) accumulate(all(x), 0ll)

const int N=2e5+10, LG=18;
int n, m, up[LG][N], tin[N], tout[N], tdfs, dep[N], deg[N], vis[N];
pair<int, int> a[N];
int b[N], check;
vector<int> g[N], g2[N];

void dfs(int u, int p){
   tin[u]=++tdfs;
   up[0][u]=p;
   dep[u]=dep[p]+1;
   for (int k=1; k<LG; ++k) up[k][u]=up[k-1][up[k-1][u]];
   for (int v:g[u]) if (v!=p) dfs(v, u);
   tout[u]=tdfs;
}

bool is_ancestor(int u, int v){
   return tin[u]<=tin[v] && tin[v]<=tout[u];
}

int lca(int u, int v){
   if (dep[u]!=dep[v]){
      if (dep[u]<dep[v]) swap(u, v);
      int d=dep[u]-dep[v];
      for (int k=0; k<LG; ++k) if (d>>k&1) u=up[k][u];
   }
   if (u==v) return u;
   for (int k=LG-1; k>=0; --k) if (up[k][u]!=up[k][v]) u=up[k][u], v=up[k][v];
   return up[0][u];
}

void dfs2(int u){
   vis[u]=1;
   for (int v:g2[u]){
      if (!vis[v]) dfs2(v);
      else if (vis[v]==1) check=0;
   }
   vis[u]=2;
}

void solve(){
   check=1;
   cin >> n;
   for (int i=1; i<n; ++i){
      int u, v; cin >> u >> v;
      g[u].push_back(v);
      g[v].push_back(u);
   }
   dfs(1, 0);
   cin >> m;
   for (int i=1; i<=m; ++i){
      cin >> a[i].first >> a[i].second;
      b[i]=lca(a[i].first, a[i].second);
   }
   for (int i=1; i<=m; ++i) for (int j=1; j<=m; ++j) if (i!=j){
      if (is_ancestor(b[i], a[j].first) && (is_ancestor(a[j].first, a[i].first) || is_ancestor(a[j].first, a[i].second))) g2[j].push_back(i), ++deg[i];
      if (is_ancestor(b[i], a[j].second) && (is_ancestor(a[j].second, a[i].first) || is_ancestor(a[j].second, a[i].second))) g2[i].push_back(j), ++deg[j];
   }
   for (int i=1; i<=m; ++i) if (!deg[i]) dfs2(i);
   check&=accumulate(vis+1, vis+m+1, 0ll)==2*m;
   cout << (check?"Yes\n":"No\n");
   for (int i=1; i<=n; ++i) g[i].clear(), g2[i].clear(), deg[i]=vis[i]=0;
   tdfs=0;
}

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   int ntests=1;
   cin >> ntests;
   for (int i=1; i<=ntests; ++i) solve();
   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...