제출 #1243999

#제출 시각아이디문제언어결과실행 시간메모리
1243999repmannJail (JOI22_jail)C++20
0 / 100
3 ms5960 KiB
#include <bits/stdc++.h>
using namespace std;
//const int BLOCK = 300;
int T, N, M, glob;
vector <int> VG[120006], DAG[120006];
bool D[120006];
int A[120006], B[120006], I[2][120006];
int ET[240006], L[120006], R[120006];
int IN[120006];
//struct PATH
//{
//  int L, R;
//  const bool operator < (const PATH &p) const
//  {
//    if((L / BLOCK) != (p.L / BLOCK)) return (L / BLOCK) < (p.L / BLOCK);
//    return R < p.R;
//  }
//}P[120006];
inline void DFS(int node, int parent = 0)
{
  for(int x : VG[node])
  {
    if(x == parent) continue;
    ET[++glob] = node;
    if(!L[node]) L[node] = glob;
    DFS(x, node);
  }
  ET[++glob] = node;
  R[node] = glob;
  return;
}
inline void Compute(int u, int v)
{
  if(L[u] < L[v])
  {
    for(int j = L[u]; j <= L[v]; j++) D[ET[j]] = 0;
    for(int j = L[u]; j <= L[v]; j++) D[ET[j]] ^= 1;
    for(int j = L[u]; j <= L[v]; j++)
    {
      if(!D[ET[j]] || (ET[j] == u)) continue;
      if(I[0][ET[j]]) DAG[I[0][u]].push_back(I[0][ET[j]]);
    }
    return;
  }
  for(int j = L[v]; j <= L[u]; j++) D[ET[j]] = 0;
  for(int j = L[v]; j <= L[u]; j++) D[ET[j]] ^= 1;
  for(int j = L[v]; j <= L[v]; j++)
  {
    if(!D[ET[j]]|| (ET[j] == u)) continue;
    if(I[0][ET[j]]) DAG[I[0][u]].push_back(I[0][ET[j]]);
  }
  return;
}
inline bool Topological()
{
  int node, counter = 0;
  queue <int> Q;
  for(int i = 1; i <= M; i++) IN[i] = 0;
  for(int i = 1; i <= M; i++) for(int x : DAG[i]) IN[x]++;
  for(int i = 1; i <= M; i++) if(!IN[i]) Q.push(i);
  while(Q.size())
  {
    node = Q.front();
    counter++;
    for(int x : DAG[node])
    {
      IN[x]--;
      if(!IN[x]) Q.push(x);
    }
    Q.pop();
  }
  return counter == M;
}
inline void Solve()
{
  cin >> N;
  for(int i = 1; i <= N; i++) I[0][i] = I[1][i] = 0;
  for(int i = 1; i <= N; i++) VG[i].clear();
  int u, v;
  for(int i = 2; i <= N; i++)
  {
    cin >> u >> v;
    VG[u].push_back(v);
    VG[v].push_back(u);
  }
  DFS(1);
//  cout << "?\n";
//  for(int i = 1; i <= glob; i++) cout << ET[i] << " \n"[i == glob];
  cin >> M;
  for(int i = 1; i <= M; i++) DAG[i].clear();
  for(int i = 1; i <= M; i++) D[i] = 0;
  for(int i = 1; i <= M; i++)
  {
    cin >> A[i] >> B[i];
    I[0][A[i]] = I[1][B[i]] = i;
  }
  for(int i = 1; i <= M; i++) Compute(A[i], B[i]);
  if(Topological()) {cout << "Yes\n"; return;}
  cout << "No\n";
  return;
}
int main()
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> T;
  while(T--) 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...