QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#661375 | #8551. DFS Order 5 | hjxddl | WA | 26ms | 9368kb | C++20 | 4.7kb | 2024-10-20 15:57:41 | 2024-10-20 15:57:44 |
Judging History
answer
// Coded by hjxddl
#include <bits/stdc++.h>
#define ll long long
#define db double
#define mid (l + r >> 1)
const int N = 1e5 + 5;
std::vector<std::vector<int>> e(N);
int n, q;
int sum[N << 2], set[2][N << 2];
void pushdown(int x, int l, int r) {
if (!set[0][x] && !set[1][x]) return;
int tar = set[0][x] ? 0 : 1;
// std::cerr << x << " " << l << " " << r << '\n';
sum[x << 1] = (mid - l + 1) * tar;
sum[x << 1 | 1] = (r - (mid + 1) + 1) * tar;
set[tar][x << 1] = set[tar][x << 1 | 1] = 1;
set[tar ^ 1][x << 1] = set[tar ^ 1][x << 1 | 1] = 0;
set[0][x] = set[1][x] = 0;
}
void change(int opt, int l1, int r1, int x = 1, int l = 1, int r = n) {
if (l1 <= l && r <= r1) {
sum[x] = (r - l + 1) * opt;
set[opt][x] = 1;
set[opt ^ 1][x] = 0;
return;
}
// std::cerr << opt << " " << l1 << " " << r1 << " " << x << " " << l << " " << r << '\n';
pushdown(x, l, r);
if (l1 <= mid)
change(opt, l1, r1, x << 1, l, mid);
if (r1 > mid)
change(opt, l1, r1, x << 1 | 1, mid + 1, r);
sum[x] = sum[x << 1] + sum[x << 1 | 1];
}
bool query(int k, int x = 1, int l = 1, int r = n) {
if (sum[x] == r - l + 1)
return true;
if (sum[x] == 0)
return false;
// std::cerr << k << " " << x << " " << l << " " << r << " " << sum[x] << '\n';
pushdown(x, l, r);
bool ans = false;
if (k <= mid)
ans = query(k, x << 1, l, mid);
else
ans = query(k, x << 1 | 1, mid + 1, r);
sum[x] = sum[x << 1] + sum[x << 1 | 1];
return ans;
}
int fa[N], son[N], dfn[N], tot, sz[N], dep[N], top[N], r_dfn[N];
void dfs1(int x, int f) {
dep[x] = dep[f] + 1;
fa[x] = f;
sz[x] = 1;
int maxson = 0;
for (int y : e[x]) {
if (y == f) continue;
dfs1(y, x);
sz[x] += sz[y];
if (maxson < sz[y]) {
son[x] = y;
maxson = sz[y];
}
}
}
void dfs2(int x, int topx) {
dfn[x] = ++tot;
r_dfn[tot] = x;
top[x] = topx;
if (!son[x]) return;
dfs2(son[x], topx);
for (int y : e[x]) {
if (y == fa[x] || y == son[x]) continue;
dfs2(y, y);
}
}
int lca(int x, int y) {
while (top[x] != top[y]) {
if (dep[top[x]] > dep[top[y]]) {
x = fa[top[x]];
} else
y = fa[top[y]];
}
return dep[x] < dep[y] ? x : y;
}
int ance(int x, int k) {
if (!k) return x;
// std::cerr << dep[x] << ' ' << x << " " << fa[top[x]] << " " << k << '\n';
while (dep[x] - dep[fa[top[x]]] <= k) {
k -= dep[x] - dep[fa[top[x]]];
x = fa[top[x]];
}
return r_dfn[dfn[x] - k];
}
void solve() {
std::cin >> n >> q;
for (int i = 1; i < n; i++) {
int u, v;
std::cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1, 1);
dfs2(1, 1);
// std::cerr << ance(4, 1) << " " << ance(4, 2) << " " << ance(6, 1) << ance(6, 2) << " " << ance(5, 1) << " " << ance(5, 0) << '\n';
std::vector<int> a(n + 5);
while (q--) {
change(0, 1, n);
int k;
std::cin >> k;
for (int i = 1; i <= k; i++)
std::cin >> a[i];
int x = a[1];
while (top[x] != 1) {
change(1, dfn[top[x]], dfn[x]);
x = fa[top[x]];
}
change(1, dfn[1], dfn[x]);
bool vis = 0;
for (int i = 2; i <= k; i++) {
int x = a[i], lst = a[i - 1];
if (son[lst]) {
if (fa[x] != lst) {
std::cout << "No" << '\n';
vis = 1;
break;
}
// std::cout << dfn[x] << " \n";
change(1, dfn[x], dfn[x]);
} else {
int anc = lca(lst, x);
int top1 = ance(lst, dep[lst] - dep[anc] - 1);
// std::cerr << anc << " " << top1 << " " << x << " " << fa[x] << " " << lst << " " << query(dfn[x]) << '\n';
if (fa[x] != anc || query(dfn[x])) {
std::cout << "No" << '\n';
vis = 1;
break;
}
// std::cout << dfn[5] << " " << dfn[top1] << " " << dfn[top1] + sz[top1] - 1 << '\n';
change(1, dfn[top1], dfn[top1] + sz[top1] - 1);
}
}
if (vis) continue;
std::cout << "Yes\n";
}
}
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0), std::cout.tie(0);
int t = 1;
// std::cin >> t;
while (t--) {
solve();
}
std::cout << std::flush;
}
// 6 1
// 2 1
// 3 1
// 4 2
// 5 2
// 6 2
// 4 3 2 6 5
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 9364kb
input:
6 7 1 2 1 3 2 4 3 5 2 6 2 4 1 2 4 2 2 4 3 2 4 4 2 4 5 2 4 6 6 1 2 6 4 3 5
output:
No No Yes No No Yes Yes
result:
ok 7 tokens
Test #2:
score: -100
Wrong Answer
time: 26ms
memory: 9368kb
input:
10 100000 7 2 1 7 7 10 8 6 8 7 1 3 4 5 9 5 5 8 8 8 9 7 2 8 1 6 1 4 8 3 5 2 6 7 10 3 9 9 1 1 1 8 10 3 2 9 3 8 7 3 7 5 6 2 8 5 9 1 6 3 4 6 2 1 3 5 8 9 2 4 9 1 3 2 1 5 5 8 5 1 7 9 10 5 2 9 2 6 4 10 6 3 8 3 4 5 8 2 8 4 9 4 10 1 2 4 3 3 6 3 1 3 6 1 1 6 8 3 1 3 7 3 2 3 9 1 5 4 3 7 8 10 9 4 2 3 10 2 5 4 3 ...
output:
No No No Yes No No No No Yes No No No No No No Yes No No No No No No No No No No No No No No No Yes No No No No No No Yes No No No No No Yes Yes No No No No No No No No No No No No No No No No No No No No No No No No Yes No No Yes Yes No No No No Yes No No No No No No No No No No No No No No No No N...
result:
wrong answer 116th words differ - expected: 'No', found: 'Yes'