Denso Create Programming Contest 2022(AtCoder Beginner Contest 239) E~F 题
E - Subtree K-th Max
题意:给定一个以 \(1\) 为根的树,节点个数为 \(n(\le 1e5)\),每个点都有自己的点权。需要回答 \(m(\le1e5)\) 次询问。每次询问给出两个数字 \(V,K\),输出节点 \(V\) 的子树中第 \(K(\le20)\) 大的值。保证询问中的子树节点个数大于 \(K\)。
观察数据范围发现 \(K\) 最大为 20,所以 DFS 统计子树中前20大的值即可
参考文章:浅谈 DFS 序
拓展:如果没有 \(K\le20\) 的话就得考虑 DFS + 主席树来做了
PS: 子树问题可以用DFS转换成序列上的问题
AC Code
int n, q;
void solve() {
cin >> n >> q;
vector<vector<int>> X(n + 1, vector<int>(20));
for (int i = 1; i <= n; i += 1) cin >> X[i][0];
vector<vector<int>> G(n + 1);
for (int i = 1, a, b; i < n; i += 1) {
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
vector<int> tmp(40);
function<void(int, int)> DFS = [&](int u, int par) {
for (int v : G[u]) if (v != par) {
DFS(v, u);
merge(X[u].begin(), X[u].end(), X[v].begin(), X[v].end(), tmp.begin(), greater<int>());
for (int i = 0; i < 20; i += 1) X[u][i] = tmp[i];
}
};
DFS(1, 0);
for (int i = 0, V, K; i < q; i += 1) {
cin >> V >> K;
cout << X[V][K - 1] << "\n";
}
}
F - Construct Highway
- 题意:有 \(n(≤1e5)\)个点,你需要构造出一颗数,满足每个点的度数都为 \(d[i]\)(\(d[i]\) 为题目给定的)。并目题目 已经给了 \(m(m<n-1)\) 条边。
思路参考 (知乎—严格鸽)
考虑一下贪心,我们先找到一个度数剩余为1的点 \(u\) ,再去找到一个度数剩余大于等于 \(2\) 的点 \(v\) ,满足两点之间是不联通的。那我们就连一条边给 \((u,v)\).
但是怎么做呢?
我们可以按照题目给定的边来构造联通块,对于 \((u,v)\) 我们保证两个点来自不同的连通块。
以下度数为剩余的度数
所以我们需要维护联通块总的度数,并将联通块分为度数等于 \(1\),和度数大于等于 \(2\) 两种。前者为\(C1\),后者为 \(C2\) 通过枚举 \(C2\) 中的联通块 \(vec\) ,将 \(vec\) 中的点与 \(C1\) 中的点连边,注意,最后 \(vec\) 中应该剩下一个点,而这个点就可以代表整个联通块 \(vec\) ,其度数为 \(1\) ,我们将其加入到 \(C1\) 中。
可以得到,\(vec\) 与 \(C1\) 中的点一定是不连通的。
这样的我们就可以构造出一颗树了,当然需要一些特判,具体我写到代码的注释里了。
int d[MAXN];
vector<int>g[MAXN];
int n, m, u, v;
void slove() {
cin >> n >> m;
int sum = 0;
for (int i = 1; i <= n; i++) { cin >> d[i]; sum += d[i]; }
if (sum != 2 * (n - 1))NO;//树的总度数为2*(n - 1)
UF uf = UF(n);
while (m--) {
cin >> u >> v;
d[u]--, d[v]--;
uf.Union(u, v);
if (d[u] < 0 || d[v] < 0)NO;//度数不能小于0
}
//处理联通块
for (int u = 1; u <= n; u++) {
while (d[u]--) {
//这里我们这样可以方便的搞出联通块的最后一个点
g[uf.findFather(u)].push_back(u);
}
}
//度数为1 度数为2
vector<int>c1; vector<vector<int>>c2;
for (int u = 1; u <= n; u++) {
if (g[u].size()) {
if (g[u].size() == 1)c1.push_back(g[u][0]);
else c2.push_back(g[u]);
}
}
vector<pair<int, int>>ans;
for (auto &vec : c2) {
int last = vec.back(); vec.pop_back();//剩下一个点
for (int u : vec) {
if (c1.size() == 0)NO;//如果c1没有了
int v = c1.back(); c1.pop_back();
ans.push_back({ u,v });
uf.Union(u, v);
}
c1.push_back(last);
}
//最后c1还是被push了,所以最后c1的个数一定要为2,如果个数大于2的话,不可能联通
if (c1.size() != 2)NO;
u = c1[0], v = c1[1];
ans.push_back({ u,v });
uf.Union(u, v);
if (uf.count == 1)
for (auto x : ans)cout << x.first << " " << x.second << endl;
else NO;
}
Denso Create Programming Contest 2022(AtCoder Beginner Contest 239) E~F 题的更多相关文章
- M-SOLUTIONS Programming Contest 2021(AtCoder Beginner Contest 232) 题解
目录 G - Modulo Shortest Path H - King's Tour 因为偷懒就只写G和H的题解了. G - Modulo Shortest Path 首先可以观察到对于一条从点\( ...
- atcoder beginner contest 251(D-E)
Tasks - Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)\ D - At Most 3 (Contestant ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解
KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...
- AtCoder Beginner Contest 255(E-F)
Aising Programming Contest 2022(AtCoder Beginner Contest 255) - AtCoder E - Lucky Numbers 题意: 给两个数组a ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
随机推荐
- Python9*9乘法表
for i in range(1, 10): for j in range(1, i+1): n = i*j print('%s*%s=%s' % (i, j, n), end=' ') if i = ...
- 洛谷5789 [TJOI2017]可乐(矩阵快速幂,Floyd思想)
题意:可乐机器人有三种行为: 停在原地,去下一个相邻的城市,自爆.它每一秒都会随机触发一种行为.现在给加里敦星球城市图,在第 0秒时可乐机器人在 1号城市,问经过了 t秒,可乐机器人的行为方案数是多少 ...
- nordic的nrf52系列32M速率的SPI-SPIM3
简介:在nordic的nrf52系列中的nrf52833和nrf52840的SPIM3都是支持最大32M的spi速率,其余的只有8M,当在需要刷屏,或者一些需要高速32M-SPI时,这是一个很好的使用 ...
- [ABC262D] I Hate Non-integer Number
Problem Statement You are given a sequence of positive integers $A=(a_1,\ldots,a_N)$ of length $N$. ...
- Spring中Bean的加载方式~
1.方式一:基于spring.xml方式配置Bean user import lombok.Data; /** * @author : ly */ @Data public class User { ...
- Python——第五章:Traceback模块
traceback 模块提供了在程序中处理和分析异常时的工具,帮助开发人员更好地理解程序出现问题的原因. 使用 traceback.format_exc() 函数可以获取当前异常的堆栈信息.可以把错误 ...
- 在Linux上部署.net Core 步骤以及遇到的一些问题
Linux安装部署手册 一.安装.NET Core SDK centos 7 系统命令为: sudo rpm -Uvh https://packages.microsoft.com/config/ce ...
- P6357 题解
Luogu 题面 题目描述 给定一串长度为 \(n\) 的数字,数字为 \(0 \sim 9\) 之间的任意一个,下标从 \(1\) 记起. 然后进行 \(m\) 次区间查询,每次查找区间 \([l, ...
- BFS(一)单词接龙
对应 LeetCode 127 单词接龙 问题定义 给定一个字典序列 wordList,一个初始的单词 beginWord 和一个目标单词 endWord,现在要求每次变换满足以下条件将 beginW ...
- 【scikit-learn基础】--『监督学习』之 决策树分类
决策树分类算法是一种监督学习算法,它的基本原理是将数据集通过一系列的问题进行拆分,这些问题被视为决策树的叶子节点和内部节点.决策树的每个分支代表一个可能的决策结果,而每个叶子节点代表一个最终的分类结果 ...