P1600 [NOIP2016 提高组] 天天爱跑步(线段树合并,lca)

P1600 [NOIP2016 提高组] 天天爱跑步

给定一颗有nnn个点的树,有mmm个人在树上移动,第iii个人从sis_isi点,移动到tit_iti点,且他们按照最短路移动,每秒移动一条边的距离,

iiiwiw_iwi时刻有一个观察员,我们需要对每个点统计,在wiw_iwi时刻有多少个人恰好到达这个点。

如果第vvv个人,在wuw_uwu时刻恰好出现在点uuu,则一定有dis(sv,u)=wudis(s_v, u) = w_udis(sv,u)=wu,且uuusv,tvs_v, t_vsv,tv的路径上,

满足dis(s,u)+dis(u,t)=dis(s,t)dis(s, u) + dis(u, t) = dis(s, t)dis(s,u)+dis(u,t)=dis(s,t),假设lca(s,t)=zlca(s, t) = zlca(s,t)=z分两种情况讨论,以111号节点为根,d(i)d(i)d(i)表示第iii号节点的深度,

  • uuus−>zs->zs>z的路径上,则有d(s)−d(u)+d(u)+d(t)−2×d(z)=d(s)+d(z)−2×d(z)d(s) - d(u) + d(u) + d(t) - 2 \times d(z) = d(s) + d(z) - 2 \times d(z)d(s)d(u)+d(u)+d(t)2×d(z)=d(s)+d(z)2×d(z),且d(s)−d(u)=wud(s) - d(u) = w_ud(s)d(u)=wu

  • uuut−>zt->zt>z的路径上,则有d(s)+d(u)−2×d(z)+d(t)−d(z)=d(s)+d(z)−2×d(z)d(s) + d(u) - 2 \times d(z) + d(t) - d(z) = d(s) + d(z) - 2 \times d(z)d(s)+d(u)2×d(z)+d(t)d(z)=d(s)+d(z)2×d(z),且d(s)+d(u)−2×d(z)=wud(s) + d(u) - 2 \times d(z) = w_ud(s)+d(u)2×d(z)=wu

前项都是符合要求的,所以看后面的两项d(s)=d(u)+wud(s) = d(u) + w_ud(s)=d(u)+wud(u)−w=2×d(z)−d(s)d(u) - w = 2 \times d(z) - d(s)d(u)w=2×d(z)d(s)

考虑树上差分,在sss点插入d(s)d(s)d(s),在ttt点插入2×d(z)−d(s)2 \times d(z) - d(s)2×d(z)d(s)

lcalcalca处减去d(s)d(s)d(s)的值,在fa(lca)fa(lca)fa(lca)处减去2×d(z)−d(s)2 \times d(z) - d(s)2×d(z)d(s)的值,二者可互换顺序,之后只要线段树合并,再单点查询值即可。

#include <bits/stdc++.h>using namespace std;const int N = 3e5 + 10, maxn = 300000;int head[N], to[N << 1], nex[N << 1], cnt = 1;int dep[N], fa[N], son[N], sz[N], top[N];int w[N], ans[N], n, m;int root[N], ls[N << 5], rs[N << 5], sum[N << 5], num;vector<pair<int, int>> a[N];void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs1(int rt, int f) {fa[rt] = f, dep[rt] = dep[f] + 1, sz[rt] = 1;for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dfs1(to[i], rt);sz[rt] += sz[to[i]];if (!son[rt] || sz[to[i]] > sz[son[rt]]) {son[rt] = to[i];}}
}void dfs2(int rt, int tp) {top[rt] = tp;if (!son[rt]) {return ;}dfs2(son[rt], tp);for (int i = head[rt]; i; i = nex[i]) {if (to[i] == son[rt] || to[i] == fa[rt]) {continue;}dfs2(to[i], to[i]);}
}int lca(int u, int v) {while (top[u] != top[v]) {if (dep[top[u]] < dep[top[v]]) {swap(u, v);}u = fa[top[u]];}return dep[u] < dep[v] ? u : v;
}void update(int &rt, int l, int r, int x, int v) {if (!rt) {rt = ++num;}sum[rt] += v;if (l == r) {return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x, v);}else {update(rs[rt], mid + 1, r, x, v);}
}int query(int rt, int l, int r, int x) {if (l == r) {return sum[rt];}int mid = l + r >> 1;if (x <= mid) {return query(ls[rt], l, mid, x);}else {return query(rs[rt], mid + 1, r, x);}
}int merge(int x, int y, int l, int r) {if (!x || !y) {return x | y;}if (l == r) {sum[x] += sum[y];return x;}int mid = l + r >> 1;ls[x] = merge(ls[x], ls[y], l, mid);rs[x] = merge(rs[x], rs[y], mid + 1, r);sum[x] = sum[ls[x]] + sum[rs[x]];return x;
}void dfs(int rt, int fa) {for (auto it : a[rt]) {update(root[rt], -maxn, maxn, it.first, it.second);}for (int i = head[rt]; i; i = nex[i]) {if (to[i] == fa) {continue;}dfs(to[i], rt);root[rt] = merge(root[rt], root[to[i]], -maxn, maxn);}ans[rt] = query(root[rt], -maxn, maxn, dep[rt] + w[rt]);if (w[rt]) {ans[rt] += query(root[rt], -maxn, maxn, dep[rt] - w[rt]);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1, x, y; i < n; i++) {scanf("%d %d", &x, &y);add(x, y);add(y, x);}dfs1(1, 0);dfs2(1, 1);for (int i = 1; i <= n; i++) {scanf("%d", &w[i]);}for (int i = 1, s, t; i <= m; i++) {scanf("%d %d", &s, &t);int f = lca(s, t), ff = fa[f];a[s].push_back({dep[s], 1});a[t].push_back({2 * dep[f] - dep[s], 1});a[f].push_back({dep[s], -1});a[ff].push_back({2 * dep[f] - dep[s], -1});}dfs(1, 0);for (int i = 1; i <= n; i++) {printf("%d%c", ans[i], i == n ? '\n' : ' ');}return 0;
}

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

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

相关文章

漫画:程序员一时单身一时爽,一直单身...有点惨

1妹子没吃早饭早啊敲哥&#xff0c;你在吃早饭啊嗯啊&#xff0c;你吃了吗&#xff1f;没呢&#xff0c;早上实在是太赶了&#xff0c;没来得及嗯...那我还是换个地方吃吧免得馋着你。。。2代码重要还是女朋友重要女朋友能哄好&#xff0c;代码能哄好吗&#xff1f;写代码是赚钱…

P3564 [POI2014]BAR-Salad Bar(ST表 + 二分)

P3564 [POI2014]BAR-Salad Bar 给定一个长度为nnn的数组&#xff0c;里面元素只有111跟−1-1−1&#xff0c;问选出一个长度为lenlenlen的区间使得&#xff0c;这个区间的前缀和时刻大于零&#xff0c;后缀和时刻大于零&#xff0c;输出最大长度lenlenlen&#xff0c; 考虑枚…

【招聘(深圳)】迈瑞招.NET 开发Leader和PM

应用开发管理&#xff08;开发leader&#xff09;工作职责&#xff1a;1.负责应用开发小组管理&#xff1b;2.协助项目经理制定项目计划和控制项目进度&#xff1b;3.评估用户需求&#xff0c;设计解决方案、系统功能&#xff0c;并带领开发小组进行交付&#xff1b;4.对开发过…

Java RMI,Socket,HttpClient

Java RMI Java远程方法调用&#xff08;Java Remote Method Invocation&#xff09; 是Java编程语言里&#xff0c;一种用于实现远程过程调用的应用程序编程接口。 它使客户机上运行的程序可以调用远程服务器上的对象。 远程方法调用特性使Java编程人员能够在网络环境中分布操…

E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)

E. Sign on Fence 给定一个长度为nnn的数组aaa&#xff0c;1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai​≤109&#xff0c;有mmm次询问&#xff0c;每次给定l,r,kl, r, kl,r,k&#xff0c;要我们在[l,r][l, r][l,r]区间内找到一个长度为kkk的区间&#xff0c;使得区间最小值最大&…

AutoMapper多个对象映射到一个Dto对象

一、定义源映射对象为了体现AutoMapper映射特性&#xff0c;在SocialAttribute中的Name属性没有定义在People中&#xff0c;People的Ear属性也不存在与SocialAttribute和PhysicalAttribute中。代码如下&#xff1a;二、注入AutoMapper例子中使用的IOC容器是Autofac&#xff0c;…

cookie 与 session

1 背景介绍 什么是会话&#xff1f; 用户打开一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一个会话。我们知道&#xff0c;HTTP协议是一种"无状态"协议&#xff0c;客户浏览器与服务器建立连接&#xff0c;发出请求&#x…

Java写一个简单的静态文件的HTTP服务器(基于Socket)

** 一、实现思路 ** 1、使用 ServerSocket 监听某一端口&#xff0c;然后等待连接获取 Socket对象。 2、创建一个类 HttpServer 继承 java.lang.Thread 类&#xff0c;重写 run()方法&#xff0c;执行浏览器请求。 3、获得浏览器请求&#xff0c;解析资源文件路径。 4、读…

P2839 [国家集训队]middle(二分 套 主席树)

P2839 [国家集训队]middle 有一个长度为nnn的序列&#xff0c;有mmm次询问&#xff0c;每次询问a,b,c,da, b, c, da,b,c,d&#xff0c;为l∈[a,b],r∈[c,d]l \in [a, b], r \in [c, d]l∈[a,b],r∈[c,d]&#xff0c;[l,r][l, r][l,r]区间的中位数最大是多少&#xff0c;强制在…

asp.net core 使用HttpClientFactory Polly实现熔断降级

前言在NET Core2.1后也是增加更新了很多东西,当然HttpClientFactory更新中的一部分.虽然说HttpClient这个实现了disposable,但使用它的时候用using包装块的方式通常不是最好的选择。处理HttpClient,底层socket套接字不会立即释放。该HttpClient类是未多个请求重复使用而创建的。…

.NET生态系统概览

本文要点.NET 5 预计会在 2020 年发布&#xff0c;届时将统一所有.NET 平台。在进行特性开发时优先考虑性能。C#语言的发展直接推动了开发者的采用。开源社区让.NET 生态系统变得更好。2002 年&#xff0c;.NET 发布。在接下来的 12 年多时间里&#xff0c;.NET 开发社区以看似…

P1848 [USACO12OPEN]Bookshelf G(线段树优化 DP)

P1848 [USACO12OPEN]Bookshelf G 有nnn间物品&#xff0c;每个物品有两个属性Wi,HiW_i, H_iWi​,Hi​&#xff0c;宽度跟高度&#xff0c;要求把这nnn件物品划分成若干连续的组&#xff0c;每组内∑Wi≤L\sum\limits W_i \leq L∑Wi​≤L&#xff0c;并且要求最小化每组最大高…

Java 实现 FTP 服务

1、FTP简介 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的…

L. Continuous Intervals(单调栈 + 线段树 + 思维)

L. Continuous Intervals 给定一个长度为nnn的数组&#xff0c;问里面有多少个区间[l,r][l, r][l,r]&#xff0c;满足&#xff0c;对这个区间排序后&#xff0c;两两差值$ \leq 1$&#xff0c;输出区间个数。 如果说区间[l,r][l, r][l,r]是符合要求的&#xff0c;则满足max(a…

Azure Application Insights REST API使用教程

本文是Azure Application Insights REST API的简单介绍&#xff0c;并会包含一个通过Python消费API的示例/小工具。新加入的team中的一项工作是制作日常的运维报表&#xff0c;制作方式是手工前往portal.azure.com&#xff0c;在网页中多次执行不同的查询语句、导出excel&#…

用Java Socket实现SMTP邮件发送

目录&#xff1a; 1、邮件基础概念2、Java Mail API介绍3、收发邮件代码示例 PS&#xff1a;如果你想直接拿代码用&#xff0c;可以直接跳到第3部分。 ** 一、邮件基础概念 ** 1.1 邮件服务器和电子邮箱 要在Internet上提供电子邮件功能&#xff0c;必须有专门的电子邮件…

微软开源新字体Cascadia Code,源于Windows Terminal

微软开源了一套新的字体 Cascadia Code。Cascadia Code 是微软在 5 月份的 Build 大会上宣布推出的等宽字体&#xff0c;微软介绍它是与新的终端 Windows Terminal 一起开发的&#xff0c;官方建议将其与终端应用和 VS、VS Code 等文本编辑器一起使用。Cascadia Code 为命令行和…

C. Safe Distance(二分 + 并查集)

C. Safe Distance&#xff08;二分 并查集&#xff09; 给定一个XYX \times YXY的矩形&#xff0c;里面有n,(1≤n≤1000)n,(1 \leq n \leq 1000)n,(1≤n≤1000)个点&#xff0c;我们要从点(0,0)(0, 0)(0,0)走到(X,Y)(X, Y)(X,Y)&#xff0c;我们要使过程中与这nnn个点的最小距…

进程间通讯的7种方式

1、常见的通信方式 管道pipe&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO&#xff1a;有名管道也是半双工的通信方式&#xff0c;但是它允许无亲缘…

官宣!VS Code Python 全新功能在 PyCon China 全球首发!

北京时间 2019 年 9 月 21 日&#xff0c;PyCon China 2019 在上海举行。在下午的演讲中&#xff0c;来自微软开发工具事业部的资深研发工程师在演讲中&#xff0c;我们看到了 Azure Notebook 与 VS Code 对 Python 的强大的支持。然而&#xff0c;鱼和熊掌似乎不可兼得。Jupyt…