제출 #860690

#제출 시각아이디문제언어결과실행 시간메모리
860690Iliya_Jail (JOI22_jail)C++14
0 / 100
10 ms33372 KiB
//IN THE NAME OF GOD #include<bits/stdc++.h> #pragma GCC optimize("O2,unroll-loops") #define endl '\n' #define F first #define S second using namespace std; typedef long long ll; const int N = 2e5+7, NN = 507, lg = 23; int mark[N], par[lg][N], h[N], tim[N][2], now, dat[N][2], ind[N], dp1[N], dp2[N]; vector<int> g[N], make[N], to; void dfs(int v, int fa){ tim[v][0] = ++now; h[v] = h[fa] + 1; par[0][v] = fa; for(ll i=1; i<lg; i++) par[i][v] = par[i-1][par[i-1][v]]; for(int u : g[v]){ if (u == fa) continue; dfs(u,v); } tim[v][1] = ++now; } void dfs2(int v){ mark[v] = 1; for(int u : make[v]){ if (mark[u]) continue; dfs2(u); } to.push_back(v); } bool ispar(int v, int u){ if (tim[v][0] <= tim[u][0] && tim[v][1] >= tim[u][1]) return 1; else return 0; } int lca(int v, int u){ if (v == u) return v; if (h[v] < h[u]) swap(v,u); int dif = h[v] - h[u]; for(int i=lg-1; i>=0; i--){ if ((dif>>i)&1) v = par[i][v]; } if (v == u) return v; for(int i=lg-1; i>=0; i--){ if (par[i][v] != par[i][u]){ v = par[i][v]; u = par[i][u]; } } return par[0][v]; } bool inway(int v, int u, int w){ int lc = lca(v,u); if ((ispar(w,v) && ispar(lc,w)) || (ispar(w,u) && ispar(lc,w))) return 1; else return 0; } int32_t main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--){ int n; cin >> n; for(int i=1; i<=n; i++){ g[i].clear(); for(ll j=0; j<lg; j++) par[j][i] = 0; } bool mas = true; for(int i=1; i<n; i++){ int v,u; cin >> v >> u; g[v].push_back(u); g[u].push_back(v); if (v != i || u != i+1) mas = false; } if (mas){ for(int i=0; i<=n+1; i++) dp1[i] = dp2[i] = 0; int m; cin >> m; for(int i=1; i<=m; i++){ int st,en; cin >> st >> en; if (st < en){ dp1[st]++; dp1[en+1]--; } else{ dp2[st]++; dp2[en-1]--; } } for(int i=1; i<=n; i++) dp1[i] += dp1[i-1]; for(int i=n; i>=1; i--) dp2[i] += dp2[i+1]; bool ans = true; for(int i=1; i<=n; i++) if (dp1[i] && dp2[i]) ans = false; cout << (ans ? "Yes" : "No") << endl; continue; } now = 0; dfs(1,0); int m; cin >> m; for(int i=1; i<=m; i++){ make[i].clear(); mark[i] = 0; ind[i] = 0; } for(int i=1; i<=m; i++) cin >> dat[i][0] >> dat[i][1]; for(int i=1; i<=m; i++){ for(int j=1; j<=m; j++){ if (j == i) continue; int s1 = dat[i][0], t1 = dat[i][1], s2 = dat[j][0], t2 = dat[j][1]; if (inway(s1,t1,s2) || inway(s2,t2,t1)) make[j].push_back(i); } } to.clear(); for(int i=1; i<=m; i++){ if (!mark[i]) dfs2(i); } reverse(to.begin(),to.end()); for(int i=0; i<int(to.size()); i++) ind[to[i]] = i; bool ans = true; for(int i=1; i<=m; i++){ for(int cur : make[i]){ if (ind[cur] < ind[i]) ans = false; } } cout << (ans ? "Yes" : "No") << endl; } 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...