做题记录 #4

news/2025/10/27 22:54:54/文章来源:https://www.cnblogs.com/Lightwhite/p/19170389

A. P11364 树上查询 (7)

一开始想着直接转 dfn 好处理一个区间的 LCA,因为编号区间可以直接变成区间最大最小 dfn 中最小 dep。但是若是想要维护,很难不上一些笛卡尔树和单调栈。玩一玩想一想发现根本想不到一个性质优秀的刻画方式,也想不到 dfn 怎么很好的跟编号对应。不过由于 dfn 求 LCA 的性质,可以发现可以把区间内 dfn 相邻 / 有交 的两个区间并起来,并起来的答案是小区间 dep 最小值取 min。所以考虑拆分极值对应大区间,比如可以把所有 dfn 相邻的中间区间 最小 dep 取 min。虽然还是没法直接维护。

但是反思一下,为什么要转 dfn。既然可以并起来,那我是不是直接拿编号相邻的并起来也可以?毕竟可以把区间内对应 dfn 当成一个点,然后如此拆分相当于用一条链串起来,很明显只要我能串到极值点就一定可以算出真正答案。因此,令 d[i] = dep[LCA(i, i + 1)],就有区间 \([l,r]\) 的 LCA 深度为 \(\min\limits_{i\in[l,r)} d_i\)。有了这个,再考虑对于每个 \(i\) 求出极长区间 \([L_i,R_i]\) 使得 dep[LCA] = d[i]。考虑如何求解:

此时相当于每次查询一个 \([l,r]\),求满足 \(|[L_i,R_i]\cap [l,r]|\geq k\) 的最大 \(d_i\)。此时相当于要求 \(R_i\geq l+k-1,L_i\leq r-k+1, R_i-L_i+1\geq k\)。首先已经可以 三维偏序 俩 log 做(没想到,qjy 教的,跑的很快。)但是如果想要直接维护,会发现 \(L_i\)\(R_i\) 的互相限制很令人头疼,不难发现其实这三个限制对应的是边界相交的三种情况,考虑怎么拆分一下。可以改成,若 \(R_i\geq r\),则需要 \(L_i\leq r-k+1\);若 \(R_i< r\),则需要 \(R_i\geq l+k-1\),且 \(R_i-L_i+1\geq k\)。前者可以 按 \(r\) 扫描线,后者按区间长扫描线即可。

Code
// STOOOOOOOOOOOOOOOOOOOOOOOOO hzt CCCCCCCCCCCCCCCCCCCCCCCORZ
#include <algorithm>
#include <cassert>
#include <iostream>
#include <numeric>
#include <vector>using namespace std;
using LL = long long;
using PII = pair<int, int>;
constexpr int kN = 5e5 + 1;int n, q;
vector<int> e[kN];
int dfn[kN], dfc, dep[kN], st[20][kN];
void Init(int x, int fa) {st[0][dfn[x] = ++dfc] = fa;dep[x] = dep[fa] + 1;for (auto v : e[x])(v != fa) && (Init(v, x), 0);
}
inline int High(int x, int y) { return dep[x] < dep[y] ? x : y; }
inline int LCA(int x, int y) {if (x == y)return x;x = dfn[x], y = dfn[y];x > y && (swap(x, y), 0);int k = __lg(y - x);return High(st[k][x + 1], st[k][y - (1 << k) + 1]);
}int t[4 * kN];
void Update(int p, int w, int x = 1, int l = 1, int r = n) {if (l == r)return t[x] = max(t[x], w), void();int mid = (l + r) / 2;if (p <= mid)Update(p, w, 2 * x, l, mid);elseUpdate(p, w, 2 * x + 1, mid + 1, r);t[x] = max(t[2 * x], t[2 * x + 1]);
}
int Max(int L, int R, int x = 1, int l = 1, int r = n) {if (R < l || r < L)return 0;else if (L <= l && r <= R)return t[x];int mid = (l + r) / 2;return max(Max(L, R, 2 * x, l, mid), Max(L, R, 2 * x + 1, mid + 1, r));
}int f[kN];
struct kItv { int l, r, w; };
vector<kItv> krg[kN];
struct rItv { int l, w; };
vector<rItv> rrg[kN];
inline void GetItv() {vector<int> v = {0};for (int i = 1; i < n; i++) {f[i] = dep[LCA(i, i + 1)];for (; v.size() > 1 && f[v.back()] > f[i]; v.pop_back()) {int l = v[v.size() - 2] + 1, r = i;krg[r - l + 1].push_back({l, r, f[v.back()]});rrg[r].push_back({l, f[v.back()]});}v.push_back(i);}for (; v.size() > 1; v.pop_back()) {int l = v[v.size() - 2] + 1, r = n;krg[r - l + 1].push_back({l, r, f[v.back()]});rrg[r].push_back({l, f[v.back()]});}for (int i = 1; i <= n; i++) {krg[1].push_back({i, i, dep[i]});rrg[i].push_back({i, dep[i]});}
}int ans[kN];
struct kQuery { int l, r, i; };
vector<kQuery> kq[kN];
struct rQuery { int l, k, i; };
vector<rQuery> rq[kN];
int main() {
#ifndef ONLINE_JUDGEfreopen("input.in", "r", stdin);freopen("output.out", "w", stdout);
#endifcin.tie(0)->sync_with_stdio(0);cin >> n;for (int i = 1, u, v; i < n; i++) {cin >> u >> v;e[u].push_back(v), e[v].push_back(u);}Init(1, 0);for (int d = 1; d < 20; d++) {for (int i = 1; i + (1 << d) - 1 <= n; i++)st[d][i] = High(st[d - 1][i], st[d - 1][i + (1 << d - 1)]);}GetItv();cin >> q;for (int i = 1, l, r, k; i <= q; i++) {cin >> l >> r >> k;kq[k].push_back({l, r, i});rq[r].push_back({l, k, i});}for (int len = n; len >= 1; len--) {for (auto [l, r, w] : krg[len])Update(r, w);for (auto [l, r, i] : kq[len])ans[i] = Max(l + len - 1, r - 1);}fill_n(t + 1, 4 * n, 0);for (int r = n; r >= 1; r--) {for (auto [l, w] : rrg[r])Update(l, w);for (auto [l, k, i] : rq[r])ans[i] = max(ans[i], Max(1, r - k + 1));}for (int i = 1; i <= q; i++)cout << ans[i] << '\n';return 0;
}

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

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

相关文章

扩散模型

论文:《Denoising Diffusion Probabilistic Models》(DDPM, NeurIPS 2020) 简述: (大白话) 训练阶段:首先是将图片一步步进行加noise,将每一步加入noise生成的像素图片进行去噪,目标是预测噪声;预测阶段:从…

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1. 实验内容 本次实验的名称为免杀原理与实践,通过本部分内容的学习,能够掌握免杀原理与技术,认识到杀软局限性,提高在工作生活中对于恶意软件防范能力…

《程序员修炼之道》阅读笔记2

书里反复强调,程序员不能把学习停留在 “够用就好” 的层面,因为技术行业的迭代速度太快了 —— 今天课堂上教的热门框架,可能几年后就会被更高效的工具替代;现在觉得 “用不上” 的底层原理,说不定哪天就成了解决…

算法分析--分治--1.二分搜索

难题被逐层拆解,每一次的拆解都使它变得更为简单。分而治之揭示了一个重要的事实:从简单做起,一切都不再复杂。 1.1 分治算法 分治 是一种非常常见的算法策略。 分:将整个问题划分为多个小问题。 治:从小问题开始…

衡量模型生成图片质量的指标

FID 是生成图像和真实图像在特征空间中的分布距离。(越小越好)1.FID 假设生成图像和真实图像在特征空间的分布都是高斯分布,然后计算这两个高斯分布的距离。 CLIP是什么?(对比语言图像预训练)它有image Encoder …

代码大全2 第一章 与第二章

看《代码大全 2》前两章,感觉像被人点醒了似的,之前对编程的理解太浅了。第一章直接说透,软件构建根本不是光敲代码就行,它跟前期琢磨需求、设计框架,还有后期测试都绑在一起,做得好不好直接影响软件能不能用久、…

面试谈薪资指南:掌握主动权的关键策略

前言 作为前大厂的技术总监,我见到过非常多的谈薪资表现,90%以上都不合格。有的漫天要价,有的临时变卦,有的丧失主动权,被牵着鼻子走,甚至还有反问HR"这个岗位的薪资预算是多少",企图打听出来企业最高…

CF2018B

CF2018B Speedbreaker 被*1900狠狠杀掉了麻麻,S组即将来临我真的没救了。。。。 考虑无解的情况,对于每一个时间 \(t\),找到能够包含所有 \(a_i\) 满足 \(a_i\leq t\) 的区间 \([l_t,r_t]\),意思就是在 \(t\) 的时…

10/27

太难了,要搭建一个真正的项目了,昨天英语作业系统故障没交上,下次交早点

第7天(中等题 滑动窗口)

打卡第七天 2道中等题class Solution { public:int equalSubstring(string s, string t, int maxCost) {int n = s.length();vector<int> diff(n, 0);//创建数组存储s和t对应位置字符的ASCII码差值for (int i = …

C++ 获取 const char* 字符串长度

C++ 获取 const char* 字符串长度C++ 获取 const char* 字符串长度 获取字符串长度的方法有哪些。 strlen strlen.c 源码如下 size_t strlen(const char *str) {const char *s;for (s = str; *s; ++s);return (s - str…

20251027——读后感2

面对多变的需求,可先做可丢弃的原型。比如要开发一个新的电商APP,先快速做个包含核心功能的简易原型,让用户试用后反馈,再基于此开发正式系统,避免在错误需求上浪费时间,就像盖房子先搭个简易框架看结构是否合理…

window[-INPUT-] 还有哪些属性或方法

在PySimpleGUI中,除了.update()方法外,window["-INPUT-"]等元素对象还支持以下属性和方法,按功能分类整理如下: 核心方法.get()功能:获取元素的当前值(如输入框内容、下拉菜单选中项等)。 示例:inpu…

DeepSeek-DSA讲解

1. MQA: Multi-Query Attention 多查询注意力机制 (MQA) 是 Transformer 中使用的传统多头自注意力机制(MHA)的一种变体。在传统的多头注意力机制中,每个注意力头都使用自己的一组查询、键和值,这可能需要大量计算,…

【转载】‘tensorrt.tensorrt.Builder‘ object has no attribute ‘build_cuda_engine‘

【转载】‘tensorrt.tensorrt.Builder‘ object has no attribute ‘build_cuda_engine‘问题简述: AttributeError: tensorrt.tensorrt.Builder object has no attribute build_cuda_engine 原因: tensorrt版本大于…

C#/.NET/.NET Core技术前沿周刊 | 第 59 期(2025年10.20-10.26)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与…

Python write to file and read from file

import uuid import datetime import timedef get_uuid_time():return (f"{uuid.uuid4().hex}_____{datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")}")def get_time():return (f"{date…

Experiment3

Task1 #include <stdio.h> char score_to_grade(int score); // 函数声明 int main() {int score;char grade;while(scanf("%d", &score) != EOF) {grade = score_to_grade(score); // 函数调用pr…

20232403 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232403 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1.实验内容 根据本周所学回答问题: (1)杀软是如何检测出恶意代码的? 杀软检测恶意代码的核心逻辑是通过 “识别恶意特征或行为”,将恶意代码的特征值…