# [NOIP 2016 提高组] 天天爱跑步 题解

news/2025/11/8 16:41:24/文章来源:https://www.cnblogs.com/Zhangshujun/p/19202628

简要题意

给定一个拥有 \(n\) 个节点的树和 \(m\) 条运动路径,求对于每个点 \(u\) , 在 \(w_i\) 时刻经过此点的玩家数量。

思路

暴力

首先暴力模拟每个玩家的运动路径来计算对每个节点 \(u\) 是否有贡献是不可取的,最劣时(即树退化成链)复杂度为 \(\Theta(nm)\)

转化

于是我们可以转换思路,不枚举玩家对每个节点 \(u\) 的贡献。那我们还能枚举什么呢? 显而易见,我们只剩下枚举每个点 \(u\) 看哪些玩家对他有贡献了,处理贡献时只需要 dfs 一遍这个树就可以了。

问题就转化成我们怎样才能计算出和统计贡献, 因为每个玩家的的运动速度是一定的,所以到达每个点的时间可以直接转化成距离,而树上的距离往往和深度又会有关系,于是我们又将距离转化到了深度之间的关系。

分类讨论

对于节点 \(p\) ,当他在一条起点在 \(s\), 终点在 \(t\) 的路径上时,怎么判断玩家有没有对它做贡献呢?

显而易见的,有两种情况

\(s\)\(\text{LCA}(s, t)\)

如图所示:

那么符合条件的 \(p\) 一定满足: \(\text{dist}(s,p) = w_p = dep_s - dep_p\) ,由于 \(s\) 是固定的,所以我们进行移项,得 \(w_p + dep_p = dep_s\)

所以当 \(w_p + dep_p = dep_s\)时, \(s\) 会对 \(p\) 做一个贡献。

\(t\)\(\text{LCA}(s, t)\)

如图:

同理,符合条件的 \(p\) 满足:\(\text{dist}(s,p) = w_p = dep_s + dep_p - 2 \times dep_{lca}\) ,仿照上文移项得 $w_p - dep_p + 2 \times dep_{lca}= dep_s $

如何统计

我们对每个节点开两个单点修改单点查询的动态开点权值线段树(貌似有点鸡肋),利用树上差分分别统计两种情况的贡献,最后查询递归时进行线段树合并后单点查询就行了。

对于第一种情况,\(p\) 的贡献来自于路径 \(s \to lca\) 所以在 \(s\) 处增加 \(dep_s\) 的贡献,再在 \(lca\) 的父亲处减少贡献。第二种情况类似。

查询时,对于每个点 \(p\) ,第一种情况直接查询 \(w_p + dep_p\) 的点有多少个,第二种类似。

Code:

#include <bits/stdc++.h>
//#define int long long
using namespace std;
int n, m;
/*链式前向星*/
constexpr int MAXN = 3e5 +5;
struct ed {int to, nxt;
} edge[MAXN << 1];
int head[MAXN];
int tot;
void add_edge(int u, int v) {edge[++tot].to = v, edge[tot].nxt = head[u], head[u] = tot;
}
/*倍增求LCA*/
constexpr int LOG = 20;
int dep[MAXN], dp[MAXN][LOG];
void dfs(int u, int fa) {dep[u] = dep[fa] + 1, dp[u][0] = fa;for (int i = head[u]; ~i; i = edge[i].nxt) {int v = edge[i].to;if (v == fa)continue;dfs(v, u);}
}
void init() {dfs(1, 0);for (int j = 1; j < LOG; ++j)for (int i = 1; i <= n; ++i)dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
int lca(int u, int v) {if (dep[u] < dep[v])swap(u, v);if (dep[u] != dep[v]) {for (int i = LOG - 1; i >= 0; --i)if (dep[dp[u][i]] >= dep[v])u = dp[u][i];}if (u == v)return u;for (int i = LOG - 1; i >= 0; --i)if (dp[u][i] != dp[v][i])u = dp[u][i], v = dp[v][i];return dp[u][0];
}
/*动态开点权值线段树*/
class SegmentTree {int trnode[MAXN * 50];int ls[MAXN*50], rs[MAXN*50];
public:int root[MAXN], cnt;
#define mid ((l +r) >> 1)void merge(int &p, int &q, int l, int r) { if (!p || !q) return p = p + q, q = 0, void(); if (l == r) {trnode[p] += trnode[q];q= 0;return;}merge(ls[p], ls[q], l, mid), merge(rs[p], rs[q], mid + 1, r);}void update(int &root, int l, int r, int x, int val) {if (!root)root = ++cnt;if (l == r)return  trnode[root] += val, void();if (x <= mid)update(ls[root], l, mid, x, val);elseupdate(rs[root], mid + 1, r, x, val);}int query(int root, int l, int r, int x) {if (!root)return  0;if (l == r)return trnode[root];if (x <= mid)return query(ls[root], l, mid, x);elsereturn query(rs[root], mid + 1, r, x);}
} tr[2];
/**/
int ans[MAXN], w[MAXN];
void calc_ans(int u, int fa) {for (int i = head[u]; ~i; i = edge[i].nxt) {int v = edge[i].to;if (v == fa)continue;calc_ans(v, u);tr[0].merge(tr[0].root[u], tr[0].root[v], 1, n);tr[1].merge(tr[1].root[u], tr[1].root[v], -n, 2 * n); //注意两个的范围不一样}
//	auto val = ;if (dep[u] + w[u] > n)ans[u] = 0;elseans[u] = tr[0].query(tr[0].root[u], 1, n, dep[u] + w[u]);ans[u] += tr[1].query(tr[1].root[u], -n, 2 * n, dep[u] - w[u]);
}
signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);memset(head, -1, sizeof(head));cin >> n >> m;for (int i = 1, u, v; i < n; ++i)cin >> u >> v, add_edge(u, v), add_edge(v, u);for (int i = 1; i <= n; ++i)cin >> w[i];init();for (int i = 1, s, t; i <= m ; ++i) {cin >> s >> t;int ances = lca(s, t);tr[0].update(tr[0].root[s], 1, n, dep[s], 1);tr[0].update(tr[0].root[ances], 1, n, dep[s], -1);tr[1].update(tr[1].root[t], -n, 2 * n, 2 * dep[ances] - dep[s], 1);tr[1].update(tr[1].root[dp[ances][0]], -n, 2 * n, 2 * dep[ances] - dep[s], -1);// 注意lca}calc_ans(1, 0);for (int i = 1; i <= n; ++i)cout << ans[i] << ' ';return 0;
}

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

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

相关文章

2025年搓管机全套管实力厂家权威推荐榜单:旋挖全套管/全回转钻机全套管/全回转全套管源头厂家精选

在基建工程持续发展的推动下,搓管机全套管作为桩基施工的关键设备,其性能直接关系到施工效率与工程质量。据基建行业数据显示,2025年中国桩工机械市场规模预计达到387亿元,年复合增长率保持在12%-15% 的区间。 搓管…

842318 - Frequently asked questions about validations and substitutions

Symptom This note deals with frequently asked questions about validation and substitution maintenance. Solution I. Creating, activating and transporting validations and substitutions 1. Which transacti…

jmter题目

一. 基础HTTP GET接口请求测试 (一). 打开JMeter,新建测试计划,右键添加“线程组”(线程数1、循环次数1)。(二). 线程组下添加“HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写…

提高组数学:扩展欧几里得

同余\({\Huge\equiv}\)是同余符号 \[a \equiv b \pmod{n} \]读作:\(a\)与\(b\)模\(n\)同余 定义:\(a\)除以\(n\)的余数等于\(b\)除以\(n\)的余数。 例 \[10 \equiv 6 \pmod{2} \]\(\because\) \[10 \% 2 = 0 \\ 6 \%…

2025广州人力资源服务推荐榜:精典人才领衔,派遣/外包靠谱公司精选3家

在企业用工需求不断升级的当下,广州人力资源服务市场愈发成熟,人力资源派遣、外包、劳务外包等服务成为企业降本增效的关键选择。本次精选 3 家口碑过硬的服务商,其中广州精典人才创新有限公司以全维度优势登顶,为…

51汇编--外部中断

51汇编--外部中断光二极管L0~L6)。外部中断1使P1.7翻转(P1.7连接到发光二极管。按键次数,并将计数结果显示在发光二极管上(P1.0~P1.6连接7个发。将外部中断0和外部中断1分别设置为高优先级和低优先级。将单脉冲信…

第182天委派与非委派约束

非约束委派 第一种做法域控管理员得有登陆过主机: 类似PTT横向的第三种手法 第二种手法的利用: 需要DC的版本在windows server 2012以上 在漏洞利用的时候需要注意修改host的内容约束委派

51汇编-跑马灯

51汇编-跑马灯P1口接八只发光二极管,编写程序使发光二极管逐个循环点亮,形成跑马灯效果,要求编写延时子程序。本文完全免费,非VIP文章,如果您发现变为VIP文章,请邮箱联系我:openwebsite@foxmail.comP1口接八只发…

51汇编--AD和DA

51汇编--AD和DA模/数转换的正确性。写入到DAC0832的数据来自内部RAM 30H单元(可在程序暂。2.升关状态为1时选择DAC0832的输出为ADC0809的模拟输入,验证数模和。1.开关状态为0时选择电位器输出为ADC0809的模拟输入,将…

flask:用Flask-SQLAlchemy访问mysql

一,安装第三方库 $ pip3 install Flask-SQLAlchemy 二,建立到数据库的连接 import os from dotenv import load_dotenvfrom flask import Flask,jsonifyfrom flask_sqlalchemy import SQLAlchemy# 加载变量 dotenv_p…

51汇编--定时器与计数器

51汇编--定时器与计数器2.用定时器1的方式2计数,T1脚接单脉冲发生器输出,用(P1.0~P1.6连。1.用定时器0的方式1定时,P1.7接发光二极管L7,使该发光二极管每秒钟。闪烁5次,要求采用中断方式。尝试改变闪烁频率,观…

2025年废棉开花机制造企业权威推荐榜单:化纤块开花机/废布专用开花机/纤维专用开花机源头厂家精选

在资源循环利用政策的推动下,废棉开花机已成为纺织废料再生行业的核心装备,其性能直接关系到纤维回收品质与生产效率。 废棉开花机作为纺织废料回收的关键设备,通过开松、分梳、清洁等工序,将废棉、废布和化纤块等…

2025年杭州工厂外贸代运营公司权威推荐榜单:海外社媒推广/海外社媒营销/外贸推广源头公司精选

在跨境电商高速发展与政策双重驱动下,杭州外贸代运营行业已形成专业化、精细化的服务生态。据行业报告显示,2024年中国电商代运营市场规模已突破2800亿元,年增长率达19.3%,其中长三角地区服务商占据全国40%以上市场…

51汇编--数码管显示

51汇编--数码管显示把LED_CS接到CS0,若接到其他位置,需要改段地址和位地址的D12~D14位。将内部RAM30H~32H单元中存储的6位十进制数显示在6个数码管上。要求编写将一个内存单元中的压缩BCD码转换为两个七段显示码的子…

深入解析:Isaac Lab 2.3深度解析:全身控制与增强遥操作如何重塑机器人学习

深入解析:Isaac Lab 2.3深度解析:全身控制与增强遥操作如何重塑机器人学习pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

51汇编--串口通信

51汇编--串口通信实现PC机与单片机之间的串口通信,波特率为2400bits/s。给PC机(使用查询方式),接收的数据存储在30H地址开始的内部RAM中。个字节的数据给单片机,单片机接收完数据后发送两个确认字节55H和AAH。本文…

51-OLED显示代码

51-OLED显示代码51单片机驱动OLED显示字符和汉字的基础代码,可以自己延申更多绘图代码。如果对启动信号,结束信号,应答信号,以及发送一个字节的命令稍加改动,也可以适配具有硬件IIC的MCU本文完全免费,非VIP文章,…

AI元人文:还论“物物交换协议”——价值、规则与共识催化

AI元人文:还论“物物交换协议”——价值、规则与共识催化 作者:岐金兰 日期:2025年11月8日 摘要 本文以“物物交换协议”为元起点,构建了一个理解人类文明的双体系模型:价值体系(可交换的“物”)与规则体系(保…

新定义RD8T36P48使用USCI0的TWI功能点亮OLED

新定义RD8T36P48使用USCI0的TWI功能点亮OLED我使用的是while循环等待发送完成标志位,这会阻塞程序的运行,还没想好怎么改,不过目前最重要的事就是配置好了TWI(我是头一次看到TWI,经过查询发现这个和IIC好像没区别…

qsl 2

// code by 樓影沫瞬_Hz17 #include <bits/extc++.h> using namespace std;#define getc() getchar_unlocked() #define putc(a) putchar_unlocked(a) #define en_ putc(\n) #define e_ putc( )using pii = pair…