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 ...
随机推荐
- Vite 5.0有哪些新变化?
Rollup 4 Vite 现在使用 Rollup 4,它也带来了一些重大的变化,特别是: 导入断言(assertions 属性)已被重命名为导入属性(attributes 属性). 不再支持 Aco ...
- 初窥门径,从大模型到内容生成看AI新次元
视频云AI进化新纪元. 最近Gartner发布2024年十大战略技术趋势,AI显然成为其背后共同的主题.全民化的生成式人工智能.AI增强开发.智能应用......我们正在进入一个AI新纪元. 从Cha ...
- 又一个涵盖前后端+DevOps+OpenAI大模型的高并发项目启动了
大家好,我是冰河~~ 今天,正式通知大家一件事情:又到了启动新项目的时候,这也是 冰河技术 知识星球继 Seckill秒杀系统 项目后,又一个高并发实战项目.星球其他项目与专栏,大家可移步到冰河的个人 ...
- numpy数组基础
目录 创建数组 多维数组切片 数组属性 使用数组 数组特殊运算符 索引进阶 花式索引 创建数组 在numpy中,创建数组有很多种方法,例如如下的例子: import numpy as np sws_1 ...
- 手动部署Kraft模式Kafka集群
手动部署Kraft模式kafka集群 基本信息 IP地址 Hostname Release Kafka-Version 172.29.145.157 iamdemo1 Centos7.9 kafka_ ...
- ACPM高效C++组件管理让音视频终端SDK性能更好、稳定性更高
本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构.技术性能.开发能效和最佳实践,一起开启音视频的开发之旅.本文为MediaBox技术架构篇,重点从 ACPM介绍. ...
- HDU 1108
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- tarjan无向图割点与割边板子
\(\Huge{割点}\) \(无向图割点判定法则\) 当遍历到一个点x时,这个点为割点的情况有两种: 第一种是该节点为根节点且子节点数>=2,必导致两个子节点不连通: 第二种是该节点不为根节点 ...
- 获取微信的token工具类
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpUtil; import cn.RedisUtil; impor ...
- ASR项目实战-决策点
针对语音识别的产品,分别记录设计.开发过程中的决策点. 实时语音识别 对于实时语音识别来说,客户端和服务端之间实时交换语音数据和识别的结果. 客户端在启动识别时,即开始发送语音数据,期望在等待较短的时 ...