28 S2模拟赛T2 开会council 题解

news/2025/10/16 15:08:35/文章来源:https://www.cnblogs.com/michaele/p/19145688

council

题面

给定一棵 \(n\) 个节点的树,每个节点有黑白两种颜色,还有 \(k\) 个特殊节点。

距离表示两个点间路径上边权的最大值。

我们每次指定一个白点,对于每个黑点,设 \(disb\) 表示其到任意一个特殊点距离的最小值,设 \(disa\) 表示此特殊点到指定白点的距离。

这个白点对答案的贡献即为 \(\sum \max (disa, disb)\)

但是有一个点的颜色不太稳定,可能由黑变白,也可能由白变黑。

你的任务是求出没有点变色的答案,以及对于每个点,其变色并且其余点不变色的答案。

\(1 \le n \le 2\times 10^5\)

题解

这道题条件很多,我们需要谨慎处理。

我们先不考虑 \(disb\) 的影响,假设每个点本身就是一个特殊点,也就是只有 \(disa\),是比较好做的。

因为每个点可能变色,所以我们要考虑一个黑点变成白点的情况。

对于每个点我们记 \(f(i,0/1)\) 表示所有白/黑点到 \(i\) 的距离和,朴素的做法是 \(O(n^2)\) 暴力跑出来。

考虑如何优化这个东西

因为我们每次都是求路径上的边权最大值,所以我们可以将树重构。

也就是从小到大枚举每条边 \((x,y,z)\),然后将 \(x,y\) 所属的连通块尝试连接起来,如果两个连通块不连通,那么 \(z\) 就会成为两个连通块的点之间的最大权值。

对每个连通块,我们记 \(siz_{fx, 0}, siz_{fx, 1}\) 分别表示白点和黑点数量,以及 \(tag_{fx,0}, tag_{fx, 1}\) 表示对连通块中的点的白黑贡献。

我们每次合并两个连通块的时候按秩合并,也就是将小的合并到大的里边。对于大块中的点,我们直接打标记,对于小块中的点,我们将其标记下放并插入到大块中。

对于每个点来说至多合并 \(O(\log n)\) 次,所以合并的时间复杂度 \(O(n \log n)\)

然后我们来处理到特殊点距离的最小值。

在这之前,我们要说明一个结论,假设起点为 \(x\),特殊点为 \(z\),白点为 \(y\)。路线 \(x \to z \to y\)\(x \to z \to x \to y\) 这两种情况的贡献是相同的。

假设我们不考虑 \(x \to z\) 相同的一段,那么也就是比较 \(z \to y\)\(z \to x \to y\) 的边权最大值,因为后者多饶了个弯,所以后者的贡献大于等于前者。

同理,我们也可以得出前者的贡献大于等于后者,所以前者的贡献就等于后者。

image-20251013210513798

所以我们分别考虑 \(x \to z\)\(x \to y\) 的贡献即可。

首先,我们可以先跑个多起点最短路算一下每个点到特殊点的距离最小值 \(dis_i\),时间复杂度 \(O(n \log n)\)

然后我们进行一个很巧妙的操作,从而将这个东西合并到我们刚才的操作中。我们不是要取这两者的最大值吗,发现这个好像和刚才的路径最大边权有点相似,考虑能否将这个到特殊点的距离也当做一个边权?

实际上是可以的,对每个点建一个新点,原点和新点之间的边权即为 \(dis_i\)

如果原点为黑点,我们设原点为无色点,新点为黑点。

否则原点为白点,新点为无色点。

image-20251013211902735

然后我们将这个新边加上即可进行统计。

总时间复杂度为 \(O(n \log n)\)

具体加加减减可以手模,具体实现看代码。

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>using namespace std;namespace michaele {typedef long long ll;const int N = 4e5 + 100, M = N << 1;int n, k;int h[N], ver[M], ne[M], e[M], tot;int kd[N], sta[N];int fa[N], siz[N][2];ll f[N][2], tag[N][2], dis[N];bool vis[N];vector <int> st[N];struct edge {int x, y;ll z;bool operator < (const edge &t) const {return z < t.z;}};vector <edge> E;void add (int x, int y, int z) {ver[ ++ tot] = y;ne[tot] = h[x];h[x] = tot;e[tot] = z;}int fin (int x) {return x == fa[x] ? x : fa[x] = fin (fa[x]);}void dijk () {priority_queue <pair <ll, int> > q;for (int i = 1; i <= k; i ++) {q.push ({0, sta[i]});dis[sta[i]] = 0;}while (q.size ()) {int x = q.top ().second;q.pop ();if (vis[x]) continue;vis[x] = 1;for (int i = h[x]; i; i = ne[i]) {int y = ver[i];if (dis[y] > max (dis[x], (ll)e[i])) {dis[y] = max (dis[x], (ll)e[i]);q.push ({-dis[y], y});}}}}void clear () {tot = 0;int size = (n + 5) << 1;memset (h, 0, size * 4);memset (vis, 0, size);memset (dis, 0x3f, size * 8);memset (siz, 0, size * 4 * 2);memset (tag, 0, size * 8 * 2);memset (f, 0, size * 8 * 2);E.clear ();for (int i = 1; i <= n * 2; i ++) {vector <int> emp;st[i].swap (emp);}}void solve () {cin >> n >> k;clear ();for (int i = 1; i <= n; i ++) {cin >> kd[i];}for (int i = 1; i < n; i ++) {int x, y, z;cin >> x >> y >> z;add (x, y, z);add (y, x, z);E.push_back ({x, y, z});}for (int i = 1; i <= k; i ++) {cin >> sta[i];}dijk ();for (int i = 1; i <= n; i ++) {fa[i] = i, fa[i + n] = i + n;st[i].push_back (i);st[i + n].push_back (i + n);if (kd[i]) siz[i + n][1] = 1;else siz[i][0] = 1;E.push_back ({i, i + n, dis[i]});}sort (E.begin(), E.end ());for (auto p : E) {int fx = fin (p.x), fy = fin (p.y);if (fx == fy) continue;if (siz[fx][0] + siz[fx][1] < siz[fy][0] + siz[fy][1]) {swap (fx, fy);}fa[fy] = fx;tag[fx][0] += (ll)p.z * siz[fy][0];tag[fx][1] += (ll)p.z * siz[fy][1];for (auto t : st[fy]) {f[t][0] += tag[fy][0] + (ll)p.z * siz[fx][0] - tag[fx][0];f[t][1] += tag[fy][1] + (ll)p.z * siz[fx][1] - tag[fx][1];st[fx].push_back (t);}siz[fx][0] += siz[fy][0];siz[fx][1] += siz[fy][1];}int ff = fin (1);for (int i = 1; i <= n * 2; i ++) {f[i][0] += tag[ff][0];f[i][1] += tag[ff][1];}ll ans = 0;for (int i = 1; i <= n; i ++) {if (kd[i]) ans += f[i + n][0];}cout << ans << endl;for (int i = 1; i <= n; i ++) {if (kd[i] == 0) {cout << ans - f[i][1] + f[i + n][0] - dis[i] << endl;} else {cout << ans - f[i + n][0] + f[i][1] - dis[i] << endl;}}}void Main () {int T;cin >> T;while (T --) {solve ();}}
}int main () {michaele :: Main ();return 0;
}

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

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

相关文章

25 LCA模拟赛3T1 ROI 2012马赛克 题解

马赛克 题面 题解 这道题想了很久如何快速求出一个点最右边或者最左边的不相容点,但是没有什么思路。 我们将题目中给定的有序对抽象为 \((a,b)\)。 最后 xpigeon 带神给出了一个结论,就是一段序列中只要出现了两个互…

实验记录2025/10/14

我现在是把picsize从640变化到了960,而且把原先7000张的训练数据集精简成了3600张的数据集 下面是跑出来的结果: Validating runs/detect/yolo11-tea-yolo11s36/weights/best.pt... Ultralytics 8.3.182 🚀 Python…

个人微信开发框架

个人微信开发框架、微信二次开发api、个人微信开发api接口,微信个人号开发API WTAPI开放平台是基于微信开放平台的二次封装API服务,开发者可以使用本服务来处理微信中的各种事件,并可以通过后台调用对应的 API 来驱…

投资指标技术分析

投资指标技术分析指数平滑移动平均线(MACD) 移动平均线收敛差异(MACD)是一种振荡类型的指标,该指标被交易者广泛用于技术分析(TA)中。MACD是一种趋势跟踪工具,利用移动平均线来确定股票、加密货币或其他可交易…

linux源码编译python

1. 下载python源码 python官网(https://www.python.org/)下载源码包 例如python3.8: Index of /ftp/python/3.8.9/ 2. 安装依赖yum install -y zlib zlib-devel sqlite-devel libffi-devel gcc openssl-devel libff…

uni-app x开发商城系统,Swiper 轮播图

一、概述 该组件一般用于导航轮播,广告展示等场景,可开箱即用,具有如下特点:自定义指示器模式,可配置指示器样式 3D轮播图效果,满足不同的开发需求 可配置显示标题,涵盖不同的应用场景 具有设置加载状态和嵌入视…

昂瑞微OM6651A:国产车规级蓝牙芯片的破局者

OM6651A——第二颗车规级低功耗蓝牙芯片,成功通过涵盖机械应力、温湿度循环等7大类共41项极限测试,斩获赛宝实验室颁发的AEC Q-100 Grade1认证(-40~125℃)。这颗采用3x2.7x0.5mm极薄LGA封装的芯片,以超低功耗与越…

2025年中央空调/锅炉房/机房运维服务厂家最新权威推荐榜:专业托管与维修外包一体化解决方案精选

2025年中央空调/锅炉房/机房运维服务厂家最新权威推荐榜:专业托管与维修外包一体化解决方案精选随着我国工业化和城市化进程的加速推进,暖通空调及动力设备运维服务行业迎来了前所未有的发展机遇。作为建筑能源系统的…

【终极解决方案】api-ms-win-core-path-l1-1-0.dll 缺失?Win7/Win10/Win11完整修复教程

许多用户在运行游戏、设计软件或系统程序时,遇到“api-ms-win-core-path-l1-1-0.dll 缺失”错误提示。本文详细解析该 DLL 文件的作用、报错原因,并提供三种高效修复方案:一键DLL修复工具、手动注册方法以及 Win7 专…

2025 年最新推荐分切机实力厂家权威榜单:覆盖全自动高速、铝箔、薄膜、高精度等机型,为软包装企业精选优质设备

随着软包装行业不断升级,分切机作为核心生产设备,其品质与性能直接关系到企业的生产效率、产品质量及市场竞争力。当前市场上,分切机厂家数量繁杂,部分厂家设备存在精度不足、材料适配性差、售后服务缺失等问题,导…

打破应用跳转流失困局,提升推广链接转化率

在移动互联网生态中,应用是用户高频使用的核心入口,而跳转应用是连接用户需求与服务落地的核心桥梁,能够提升用户活跃度与留存。传统流程需先跳转网页再手动引导至应用市场,多一步操作导致流失率增加,尤其影响广告…

《Vue3 + Vite + Pinia 实现后台管理系统:路由权限控制与动态菜单渲染》

《Vue3 + Vite + Pinia 实现后台管理系统:路由权限控制与动态菜单渲染》从零构建 Vue3 后台管理项目,包括 Vite 项目初始化、Pinia 状态管理(用户信息 / 权限存储)、基于角色的路由权限控制(router.beforeEach 拦…

检查cpu是否支撑minio方法

#!/bin/sh flags=$(cat /proc/cpuinfo | grep flags | head -n 1 | cut -d: -f2) supports_v2=awk "/cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/ {found=1}…

性能测试进阶秘籍:如何用JMeter分布式压测挖掘系统极限潜

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 "我们的系统明明配置很高,为什么单机压测TPS死活上不去?"这是无数工程师在性能测试中遇到的共同困惑。最近在一次真实项目基准…

Codeforces Round 1058 (Div. 2) A~E

A - MEX Partition 思维? 求 \(a\) 的 \(\text{mex}\)。 关于证明,参考官方题解:首先,让 \(m=\operatorname{mex}(A)\) 。我们可以忽略所有大于 \(m\) 的元素。这是因为由于 \(m\) 是 mex, \(m\) 不会出现在 \(A\…

2025 年生料带厂家最新推荐排行榜:解析优质品牌优势,涵盖新型、彩色、液态等多类型生料带厂家企业推荐

在螺纹密封领域,生料带的质量与性能对家庭生活、工业生产的安全稳定至关重要。当前市场上,部分生料带密封性能差,导致家庭水管、燃气管道漏水漏气,引发资源浪费与安全隐患;工业场景中,许多产品耐温、耐腐蚀性不足…

openresty开发lua-resty-openssl之对称加密解密 - liuxm

openresty开发lua-resty-openssl之对称加密解密local cipher = require "resty.openssl.cipher" local rand = require "resty.openssl.rand" local pkey = require "resty.openssl.pkey&quo…

腾讯云 OpenCloudOS 8 docker安装

腾讯云 OpenCloudOS 8 docker安装腾讯云 OpenCloudOS 8 docker安装 1:更新系统sudo yum update -y2:安装依赖包sudo yum install -y yum-utils device-mapper-persisten-data lvm23:添加docker官方仓库sudo yum-confi…

哈希乱搞:CF1418G Three Occurrences

这道题看起来并不是那么好做,看到题解神秘做法,记录下来。 考虑枚举右端点,统计符合条件的左端点数量。 发现 3 这个数字很小,发现区间中的数我们仅仅需要知道它 %3 的值。 我们如果可以记录一个位置前缀中所有值的…

2025 年废旧轮胎裂解加热生产厂家最新推荐榜单:优质企业专利技术、产能规模与口碑实力全景解析锂化工焚烧炉/氟化热风系统/煤化工热风炉厂家推荐

随着环保政策趋严与资源循环利用需求激增,废旧轮胎回收利用行业进入高速发展期,而裂解加热作为核心工序,其设备质量直接决定生产效率、环保达标情况与企业成本控制。当前市场上,废旧轮胎裂解加热设备厂家数量众多,…