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 ...
随机推荐
- Echarts 饼图,legend样式美化
最后样式图: 实现代码: var myChart = echarts.init(document.getElementById('container')); let option = { /*{b}: ...
- java读取照片Exif信息到实体类
前言 1.总共读出来了228个参数信息,但是我挑选了36个我认为比较有价值的参数,弄成了实体类 (其实是因为很多参数我看不明白是啥意思) 2.为了方便,所以实体类里我直接用中文字段了 效果图 导入依赖 ...
- 一个NET8 AOT编译的辅助项目,让你的任何可执行应用快速部署为服务
不知道大家有没有和小编一样,很多时候想将自己的一些应用转为服务运行,比如一些控制台应用或者.NET Core应用,但是又不想重新编码,把他们转为服务,本文将给大家提供些我使用过的方法,并提供一个基于N ...
- 【Android】学习day05|RadioButton
注意事项:当使用默认选中标签:check时,必须要给标签加id,否则失效. 这个没什么,挺简单的,就记录一下代码[监听事件] package com.example.app02; import and ...
- Opencv学习笔记(3)
Opencv库常见函数 1.读取指定图片 语法:cv2.imread()函数可以用于读取指定图片,使用时需要先导入opencv库 1 import cv2 # 导入opencv库 2 sample = ...
- SpringBoot进阶教程(七十八)邮件服务
Sun公司提供了JavaMail用来实现邮件发送,但是配置烦琐,Spring中提供了JavaMailSender用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfig ...
- 这下对阿里java这几条规范有更深理解了
背景 阿里java开发规范是阿里巴巴总结多年来的最佳编程实践,其中每一条规范都经过仔细打磨或踩坑而来,目的是为社区提供一份最佳编程规范,提升代码质量,减少bug. 这基本也是java业界都认可的开发规 ...
- 如何从Webpack迁移到Vite
本文将介绍如何将前端web应用程序从 Webpack 升级到 Vite. Vite 是最新的前端开发工具,其受欢迎程度和采用率都在大幅增长.可以查看下图中来自 npm trends 的下载. 推动这一 ...
- [USACO2007FEB S]Silver Lilypad Pond
题目描述 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成 了M行N列个方格(1 ≤ M, N ≤ 30).一些格子是坚固得令人惊讶的莲花,还有一些格子是 岩石,其余的只是 ...
- ubuntu 20.04安装mysql5.7
ubuntu 22.04系统安装mysql5.7 一.查看系统默认安装的数据库版本 apt-get update apt-cache policy mysql-server ubuntu 20.04自 ...