牛客周赛 Round 67 F

news/2024/11/13 17:21:08/文章来源:https://www.cnblogs.com/mgnisme/p/18540580

F.小Z的树迁移

思路

赛事没想出来如何做,可以发现,对于一个节点u,走d步所走的最远距离即为 深度为depthu+d且位于u的子树之中的节点距离根节点距离的最大值 再减去节点u距离根节点的距离即为结果

当我们查询时该如何做?

第一步,我们先给每个节点按照dfs序进行编号,这样保证了同一子树的节点的编号在\(l-r\)的一个连续区间内

第二步,把每个节点存进对应的深度容器中,当我们处理一个查询时,查询的深度即为depth[u]+d,我们找到对应深度容器,由于容器中满足条件的点为一段连续的区间,我们可以通过二分查询这段区间的首尾

第三步,预处理st表维护区间最大值

注意:处理二分边界条件

牛客官方题解

代码

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using piii = pair<int, pii>;
using pll = pair<ll, ll>;
using plll = pair<ll, pll>;
using plii = pair<ll, pii>;
#define fi first
#define se second
const int INF = 0x3f3f3f3f;
const ull mod1 = (1ull << 61) - 1, mod2 = 1e9 + 7;
const ull base1 = 131, base2 = 13331;
// mt19937 rnd(time(0));const int mod = 998244353;void solve() {int n;cin >> n;vector<vector<pii>> g(n + 1);for (int i = 1; i < n; i++) {int a, b, w;cin >> a >> b >> w;g[a].push_back({b, w}), g[b].push_back({a, w});}vector<int> depth(n + 1), siz(n + 1);vector<vector<pair<int, ll>>> tups(n + 1);vector<ll> dist(n + 1), dfn(n + 1);int cnt = 0;auto dfs = [&](auto&& self, int u, int fa) -> void {dfn[u] = ++cnt;depth[u] = depth[fa] + 1;siz[u] = 1;for (auto [y, w] : g[u]) {if (y == fa)continue;dist[y] = dist[u] + w;self(self, y, u);siz[u] += siz[y];}};dfs(dfs, 1, 0);for (int i = 1; i <= n; i++) {tups[depth[i]].push_back({dfn[i], dist[i]});}for (int i = 1; i <= n; i++) {auto& v = tups[i];sort(v.begin(), v.end());}vector<vector<vector<ll>>> sts(n + 1);for (int i = 1; i <= n; i++) {int len = tups[i].size();auto& v = sts[i];auto& data = tups[i];if (len) {int flen = log2(len) + 1;v.resize(len);for (int j = 0; j < len; j++)v[j].resize(flen);for (int j = 0; j < flen; j++) {for (int k = 0; k + (1 << j) - 1 < len; k++) {if (j == 0)v[k][j] = data[k].se;else {v[k][j] = max(v[k][j - 1], v[k + (1 << j - 1)][j - 1]);}}}}}auto get = [&](int l, int r, int dep) {auto& v = sts[dep];int k = log2(r - l + 1);// cout<<l<<" "<<r<<" "<<v.size()<<" "<<dep<<" "<<k<<endl;// cout<<v[0].size()<<endl;return max(v[l][k], v[r - (1 << k) + 1][k]);};int q;cin >> q;while (q--) {int u, d;cin >> u >> d;int dep = depth[u] + d;if (dep > n) {cout << -1 << endl;continue;}int bg = dfn[u], ed = dfn[u] + siz[u] - 1;auto& v = tups[dep];if (v.size() == 0) {cout << -1 << endl;continue;}int l1 = 0, r1 = v.size() - 1;while (l1 < r1) {int mid = l1 + r1 >> 1;if (v[mid].fi >= bg)r1 = mid;elsel1 = mid + 1;}int l2 = 0, r2 = v.size() - 1;while (l2 < r2) {int mid = l2 + r2 + 1 >> 1;if (v[mid].fi <= ed)l2 = mid;elser2 = mid - 1;}if (l2 < l1) {cout << -1 << endl;continue;}auto tt = v.front().fi;if (v.size() == 1 && (tt < bg || tt > ed)) {cout << -1 << endl;continue;}cout << get(l1, l2, dep) - dist[u] << endl;}
}int main() {cin.tie(nullptr);ios::sync_with_stdio(false);int _ = 1;// cin >> _;while (_--) {solve();}return 0;
}

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

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

相关文章

极限limit

The Limit 两个重要极限\[\displaystyle\lim_{x\to 0}\frac{sinx}{x}=1 \]\[\displaystyle\lim_{x\to \infty}(1+x)^{\frac{1}{x}}=e \]间断点 1.第一类间断点 第一类间断点是指在该点附近的函数值存在,但在该点的极限不存在。具体来说,若 $ f(x) $ 在 $ x = c $ 附近的左极限…

基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现三

该系统总共24张表,代码整洁,每个功能、接口上都有注释说明。 运行环境:jdk1.8、mysql5.x、eclipse/idea、maven3.5/3.6 包远程运行的哦。 特色功能:发布课程、学习课程、分享资料、资料讨论等。 部分功能:关于我们信息实体类Entity、评论信息实体类Entity、课程资料信息实…

SpringBoot+Thyemleaf开发环境正常,打jar包发到服务器就报错Template might not exist or might not ..

前言 前几天,我在开发前后端一体的项目时候,遇到了一个巨大的坑。这个是关于SpringBoot+Thyemleaf的。现象就是,我在本地开发环境是好的,正常访问某个页面,但是到了打成jar包后,部署到服务器之后,再访问那个页面,总是报错。这个报错是类似于Template might not exist o…

推荐一个Star超过2K的.Net轻量级的CMS开源项目

推荐一个具有模块化和可扩展的架构的CMS开源项目。 01 项目简介 Piranha CMS是一个轻量级且跨平台的CMS库,专为.NET 8设计。 该项目提供多种模板,具备CMS基本功能,也有空模板方便从头开始构建新网站,甚至可以作为移动应用的后端。 是一个完全解耦的CMS,意味着我们可以使用…

Chrome如何查看保存的网站密码,如此简单!

前言 我在开发java应用的时候,一般都是使用谷歌浏览器的,也就是Chrome浏览器。这个浏览器几乎是所有浏览器里面功能最强大的浏览器。里面有很多神奇的东西。比如,它可以帮助我们记住我们登录的网站的账号密码。有时候,我们可能已经习惯了谷歌浏览器帮助我们保存的密码了,有…

现代IT基础设施管理(1):Terraform初识和小试牛刀

基础设施包括各种云,像国内的阿里云、腾讯云和华为云,国外的AWS、微软Azure云和谷歌云,还有Kubernetes和OpenStack,都可以用Terraform进行资源管理。使用基础设施即代码(Infrastructure as Code, IaC)的方式来管理基础设施,这是现代IT基础设施管理的一个重要趋势,它允许…

用一个项目把控制层、业务层、持久层将明白了,每一句话都讲的很清楚

实现一个数据库和前端的交互 三层结构持久层开发:依据前端页面的设置规划相关的sql语句,以及进行配置业务层开发:核心功能控制、业务操作以及异常的处理控制层开发:前后端连接,接受请求,处理响应完整的数据响应流程如下:前端发起请求: 前端通过浏览器或其他客户端发起H…

『模拟赛』NOIP2024加赛4

『模拟赛记录』NOIP2024加赛4Rank 给我唐完了,又名,【MX-S5】梦熊 NOIP 2024 模拟赛 1。A. 王国边缘 好像简单倍增就做完了。 由于昨天 T5 在我脑海中留下了挥之不去的印象,今天一上来看到这题就发现是一个内向基环树森林。然后被硬控硬控硬控,最后一个小点加一点优化就能过…

使用 roslyn 的 Source Generator 自动完成依赖收集和注册

roslyn Source Generator 使用案例在 使用 Hosting 构建 WPF 程序 提到,因为不使用 Stylet 默认的 IOC 容器,所以不能自动收集和注册 View/ViewModel,需要动手处理。 如果项目比较大,手动处理显然过于麻烦。这里使用 roslyn 的 Source Generator 自动完成依赖收集和注册。 …

高级语言程序设计第七次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/2024C/ 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400204 姓名:刘嘉奕 1.2.需要思维贯穿,逻辑性强3.刚开始没用指针,导致结果为负数,但在使用指针过程中还存在不…

叉积

向量基本运算点积叉积一.Transmitters由叉积的基本定理得出,要判断一个点c再一条直线ab的左边还是右边,只要看(b-a)*(c-a)大于0还是小于0,对于这题,我们可以将左右边看成发射范围的半圆,因为要找出覆盖最多点的数量,所以最优解肯定有一个点再直径上,再通过叉积找出所…

内核脏牛提权

脏牛靶机 已知靶机账号密码:msfadmin/msfadmin 靶机开启ssh服务开启靶机获取IP msfadmin/msfadmin登录 ifconfig #获取靶机IP得到靶机IP:192.168.213.247 开启kali ssh链接靶机 直接输入ssh msfadmin@192.168.213.247进行链接会出现报错 出现报错的原因是ssh客户端和服务器之…