QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#661191 | #8551. DFS Order 5 | hjxddl# | WA | 28ms | 11496kb | C++20 | 4.3kb | 2024-10-20 15:07:52 | 2024-10-20 15:07:54 |
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;
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);
int 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) {
fa[x] = f;
sz[x] = 1;
dep[x] = dep[f] + 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);
}
}
std::pair<int, int> lca(int x, int y) {
int lstx = 0;
while (top[x] != top[y]) {
if (dep[top[x]] > dep[top[y]]) {
lstx = x;
x = fa[top[x]];
} else
y = fa[top[y]];
}
return {dep[x] < dep[y] ? x : y, top[lstx]};
}
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::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;
}
change(1, dfn[x], dfn[x]);
} else {
auto [anc, top1] = lca(lst, x);
// 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;
}
if (fa[top1] != anc) {
top1 = fa[top1];
top1 = r_dfn[dfn[top1] - (dep[top1] - (dep[anc] + 1))];
}
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;
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 9284kb
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: 28ms
memory: 11496kb
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'