Codeforces Round 932 (Div. 2) ---- F. Andrey‘s Tree ---- 题解

F. Andrey's Tree:

题目描述:

思路解析:

我们假设删除任意一个结点后,我们会将整个树切分为k个联通块,那么可以明确的知道我们只需要连接(k-1)条边就可以将这k个联通块重新连为一棵树。

那么最小代价是啥呢? 图解分析

 第一种情况,有至少一个联通块即拥有小于删除点的数,又有大于删除的数,此时代价就是要增加的边数

第二种情况,没有上诉的联通块。

 我们可以发现我们还是可以将整个联通块连接为 (1,x-1) 和 (x+1,n)的两个联通块,花费为k-2,此时还需要2个花费,将整个联通块连接为(1,n)的联通块,总花费为删除结点后,联通块的个数。

经过此时分析,我们可以发现我们其实已知需要连多少条边,需要多少代价,这是固定的。花费只由是否有一个联通块中既有小于x的值和大于x的值决定。 因为初始是一棵树,那么假如有一条边为2-7,可以发现后面的边无论怎么样,对于删除3,4,6,来说,一定有个联通块含有(2和7)满足上诉要求,则此时可以通过前缀和来实现。

根据前两个图发现,只要两种连接情况 (x,x+1) (x,x-1)(y,y+2), 且x为联通块的最小值或者最大值,y=删除值-1,那么我们只要维护每个联通块的最小值和最大值即可,并且维护删除结点后,有哪些联通块即可。

代码实现:

import java.io.*;
import java.math.BigInteger;
import java.util.*;import static java.util.Collections.*;public class Main {static int inf = (int) 1e9;static int mod = 998244353;public static void main(String[] args) throws IOException {int t = f.nextInt();while (t > 0) {solve();t--;}w.flush();w.close();br.close();}static int[] maxIn;static int[] maxOut;static int[] minIn;static int[] minOut;static int[] p;static Vector<Integer>[] g;static int n;public static void solve() {n = f.nextInt();g = new Vector[n];for (int i = 0; i < n; i++) {g[i] = new Vector<>();}int[] d = new int[n];for (int i = 0; i < n - 1; i++) {int u = f.nextInt() - 1;int v = f.nextInt() - 1;g[u].add(v);g[v].add(u);if (u > v) {int tmp = u;u = v;v = tmp;}d[u + 1]++;d[v]--;}for (int i = 1; i < n; i++) {d[i] += d[i - 1];}d[0] = d[n - 1] = 1;for (int i = 0; i < n; i++) {d[i] = d[i] >= 1 ? 1 : 0;}maxIn = new int[n];minIn = new int[n];maxOut = new int[n];minOut = new int[n];p = new int[n];Arrays.fill(minOut, n);dfs1(0);dfs2(0);for (int x = 0; x < n; x++) {int res = g[x].size() - d[x];w.println(res + " " + (g[x].size() - 1));ArrayList<int[]> q = new ArrayList<>();for (int i = 0; i < g[x].size(); i++) {int y = g[x].get(i);if (y == p[x]){q.add(new int[] {minOut[x], maxOut[x]});}else {q.add(new int[]{minIn[y], maxIn[y]});}}int lst = -1;q.sort(new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] - o2[0];}});for (int[] a : q) {if (a[0] >= x) break;if (lst != - 1) w.println(a[0] + 1 + " " + a[0]);lst = a[0];}lst = -1;q.sort(new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o2[1] - o1[1];}});int c = 0;for (int[] a : q) {if (a[1] <= x) break;if (lst != - 1 && (c == 0 || a[0] > x)) w.println(a[1] + 2 + " " + (a[1] + 1));lst = a[0];c |= (a[0] < x ? 1 : 0);}if (c == 0 && x > 0 && x + 1 < n) w.println(x + " " + (x + 2));w.println();}}static void dfs1(int x) {minIn[x] = x;maxIn[x] = x;for (int i = 0; i < g[x].size(); i++) {int y = g[x].get(i);if (y == p[x]) continue;p[y] = x;dfs1(y);minIn[x] = Math.min(minIn[y], minIn[x]);maxIn[x] = Math.max(maxIn[y], maxIn[x]);}}static void dfs2(int x) {int[] mx = new int[2];int[] mn = new int[2];mn[0] = mn[1] = n;for (int i = 0; i < g[x].size(); i++) {int y = g[x].get(i);if (y == p[x]) continue;int a = minIn[y];int b = maxIn[y];for (int j = 0; j < 2; j++) {if (a < mn[j]){int tmp = mn[j];mn[j] = a;a = tmp;}if (b > mx[j]){int tmp = mx[j];mx[j] = b;b = tmp;}}}for (int i = 0; i < g[x].size(); i++) {int y = g[x].get(i);if (y == p[x]) continue;int a = mx[mx[0] == maxIn[y] ? 1 : 0];int b = mn[mn[0] == minIn[y] ? 1 : 0];maxOut[y] = Math.max(maxOut[x], Math.max(a, x));minOut[y] = Math.min(minOut[x], Math.min(b, x));dfs2(y);}}static PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out));static Input f = new Input(System.in);static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static class Input {public BufferedReader reader;public StringTokenizer tokenizer;public Input(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = null;}public String next() {while (tokenizer == null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(reader.readLine());} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}public String nextLine() {String str = null;try {str = reader.readLine();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return str;}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public Double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/798384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网站项目】校园订餐小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

鱼骨图功能实现

dom: <div class="module-content"><div class="title"><span>[</span><p>鱼骨图</p><span>]</span></div><div class="line-mian"></div><div :ref="module + i&q…

2024-04-07 作业

作业要求&#xff1a; 1> 思维导图 2> 自由发挥应用场景实现一个登录窗口界面。 【可以是QQ登录界面、也可以是自己发挥的登录界面】 要求&#xff1a;尽量每行代码都有注释 作业1&#xff1a; 作业2&#xff1a; 运行代码&#xff1a; #include "myqwidget.h&quo…

hatch,现代化的 Python 项目管理和打包工具!

目录 前言 安装 特性 基本功能 项目创建 示例代码 虚拟环境管理 依赖管理 测试 打包和发布 高级功能 插件系统 配置环境管理 自定义构建选项 集成测试工具 实际应用场景 多环境管理 持续集成与持续部署&#xff08;CI/CD&#xff09; 项目原型化 依赖与包管理 总结 前言…

Q1剧集市场复盘:2024爱优腾谁在领跑国产剧市场?

2024年Q1剧集市场的成绩单出炉了。 复盘2024年第一季度剧集市场&#xff0c;可以用“生机勃勃”四个字来形容&#xff0c;虽然和去年相比&#xff0c;今年的第一季度缺少了《狂飙》这样的头部大爆款&#xff0c;但市场大盘走势向好。 根据灯塔专业版统计&#xff0c;2024Q1剧…

nginx配置实例-反向代理

目录 一、目标-反向代理实现效果 二、安装tomcat 三、配置nginx服务 四、配置反向代理 一、目标-反向代理实现效果 访问过程分析&#xff1a; 二、安装tomcat 1、安装jdk环境 新建/export/server目录 解压jdk 查看是否解压成功 配置jdk软连接 进入jdk的bin目录中&#x…

echart 折线图或散点图当横坐标为小数位时,若想显示整数该如何处理?

如图当前是这样的&#xff1a; 横坐标刻度目前是小数位&#xff0c;如果直接将小数位取整则会失去精度&#xff0c;所以我们要做的是刻度即是整数&#xff0c;又能显示小数位对应的数值&#xff1b; 思路就是直接手动设置刻度&#xff1a;设置xAxis的min,max,splitNumber,同时不…

蓝桥杯-冶炼金属(二分求最大最小)

P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二分做法&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N 1e410; int n,a,b; int v[N],cnt[N]; int check(int x){for(int i1;i<n;i…

火山方舟大模型服务平台调用Demo测试(豆包)

豆包得后台大模型支持为字节得火山方舟&#xff0c;所以想使用豆包的API&#xff0c;直接从这里就可以。 一、首先注册账号&#xff1a; 火山引擎-云上增长新动力 注册完成之后&#xff0c;控制台-账户-API访问密钥 二、找到API测试用例&#xff1a; Skylark-chat API调用…

数组排序(Comparator)

题目 import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();Integer[] res new Integer[n1];//使用Integ…

让智能体像孩子一样观察别人学习动作,跨视角技能学习数据集EgoExoLearn来了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 在探索人工智能边界时&#xff0c;我们时常惊叹于人类孩童的学习能力 —— 可以轻易地将他人…

OLAP 和 OLTP

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OLTP与OLAP的介绍OLTP&#xff08;on-line transaction processing&#xff09;&#xff1a;联机事务处理OLAP&#xff08;On-Line Analytical Processing&#xff…

SOLIDWORKS在教育领域的应用

随着科技的飞速发展和数字化浪潮的推进&#xff0c;SOLIDWORKS作为一款强大的三维设计软件&#xff0c;其应用领域已经不仅局限于工程设计和制造行业&#xff0c;还逐渐渗透到教育领域中&#xff0c;成为培养学生实践能力和创新思维的重要工具。本文将探讨SOLIDWORKS在教育领域…

【JavaEE】_Spring MVC项目获取Cookie

目录 1. Cookie与Session基础知识 1.1 Cookie与Session的区别 2. 使用servlet原生方法获取Cookie 2.2 关于λ表达式遍历法的空指针问题 2.3 Cookie的伪造 3. 使用Spring注解获取Cookie 3.1 获取单个Cookie 3.2 获取多个Cookie 1. Cookie与Session基础知识 在本专栏HTT…

CICD流水线 发布公用jar到maven私仓

3.1 发布公用jar到Maven私仓 1.选择流水线 2.新建流水线 3.选择模版 4.选择代码仓库 5. 调整构建命令 6.新增一个新阶段为 ”发送通知“&#xff0c;这里以邮件通知为例&#xff0c;保存之后&#xff0c;运行该流水线&#xff0c;对应jar就会自动发到我们私仓&#xff0c;并之…

中药配方颗粒备案信息数据库<2.5W+备案>

中药配方颗粒备案信息是指中药配方颗粒生产企业向国家药品监督管理局申报备案的相关信息。备案信息包括中药配方颗粒的名称、备案号、备案时间、备案状态、生产企业、生产地址、规格、包装、执行标准、保质期、不良反应检测、备案省局等信息。 通过对中药配方颗粒备案信息的查…

【Linux】正则表达式实验操作实例

正则表达式是一种强大的工具&#xff0c;用于在文本中查找、匹配和替换特定的字符串模式。 实验目的 掌握正则表达式的表达方式掌握grep/egrep命令的用法掌握sed 命令的用法掌握awk命令的用法 正则表达式 实验目的实验内容实验过程创建grep文件来进行如下操作用sed命令完成下列…

春招-实战项目冲刺直播课

春招-实战项目冲刺直播课 CCtalk 丰富多元的综合内容平台-专业的知识分享与在线教育平台https://www.cctalk.com/m/group/91161801

蓝桥杯刷题-13-子矩阵-二维滑动窗口 ಥ_ಥ

给定一个 n m &#xff08;n 行 m 列&#xff09;的矩阵。 设一个矩阵的价值为其所有数中的最大值和最小值的乘积。求给定矩阵的所有大小为 a b &#xff08;a 行 b 列&#xff09;的子矩阵的价值的和。 答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。…

Redis 常见面试题

目录 1. Redis是什么&#xff1f;2. Redis优缺点&#xff1f;3. Redis为什么这么快&#xff1f;4. 既然Redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存&#xff1f;5. Redis的线程模型&#xff1f;6. Redis 采用单线程为什么还这么快&#xff1f;7. R…