这是一篇极其简单连像我这样省三参加不了省选的蒟蒻都能看懂的题解

前置知识: 倍增LCA  二分 栈 题意


PS:这是一篇完全面向初学者的题解,会非常细,大佬请无视

题目传送门

没有思路的时候, 我们往往可以从简单的情况下手, 比如一条链

我们记Pi为第i个需要搜集的宝石, S为起点, T为终点。

不妨先假设我们有一条链, 每个节点指向下一个要搜集的宝石(向上), 也就p1指向向上最近的一个p2, p2指向p3(为什么是最近,读者可自行思考)

这个时候S是第一个要搜集的宝石, 我们考虑从S一路沿链往上跳,发现跳到1号点的时候就已经超过T了, 所以最多能跳到3号点, 也就是最多能搜集到P2

很简单, 链的情况我们已经解决了

然而这个算法的复杂度是O(n)的, 我们考虑优化。这时候,如果对lca十分熟悉的话, 就会想到在朴素lca中, 深度较大的那个节点会一直往上跳, 直到与另一个节点深度相同,与这个情况十分相同。

最后,lca采用倍增优化的方式往上跳

   for(int i=20;i>=0;i--)if(deep[f[x][i]]>=deep[y])x=f[x][i];

从大到小枚举, 如果深度没有超过另一个节点就往上跳

自然而然的想到,这道题也可以用倍增来跳, 预处理一个f数组, Fi, j 表示i号点, 下2^j个需要搜集的宝石的位置, 只要没有超过T就直接往上跳

for(int i=25; i>=0; i--){
int next = f1[now][i];
if(t!=0 && deep[next]>=deep[T]) now=next, i=25;
}

好!链的情况解决链, 一般情况就很简单了。

(是不是讲的有点太细了

不难发现, S-T的路径被lca分成两部分。

对于S的那一部分,可以采用链的方法解决, 这时候我们得到一个Px:S链最远能匹配到的宝石,在上图中, x=2

对于T链, 我们并不能从lca往下跳(显然), 我们考虑从下往上跳。

我们让p4指向p3(刚好相反), 也就是让每个点指向上一个要搜集的宝石。

不妨从一个Py点开始向上跳, 假如能跳到一个Px+1, 那么Py就可以被搜集到(因为S已经从P1搜集到x了, T又从x+1搜集到y了,所以可以从1搜集到y)。

那么答案是不是可以搜集到y个呢?显然不是, 万一某个Pz也能够跳到Px+1, 而z>y呢

这时候仔细思考,答案有单调性,可以二分,(因为假如能从1搜集到z,肯定也能从1到y...)

所以最终的思路: 二分可以搜集到第几个颜色, 如果可以从该节点跳到x+1(倍增), 则满足

复杂度


简单实现

  实现很简单

  1. 首先预处理三个倍增, 第一个普通倍增求LCA, 另外两个是S, T链上的倍增。

    既然要倍增, 我们首先要知道每个节点的父节点,然后dp。对于这道题, 我们要知道对于某个点Px, 祖先中离他最近的Px+1, Px-1才行。怎么做呢?

    很简单:对树进行dfs,开一个栈stack s[N]; 每到一个点Px就把节点编号压入s[x], 回溯的时候弹出就好了。所以 (S链)f1[x][0]=s[x+1].top(), (T) f2[x][0]=s[x-1].top();然后普通倍增就好了

for(int i=1; i<=n; i++){
for(int j=1; j<=28; j++){
f[i][j] = f[f[i][j-1]][j-1];
f1[i][j] = f1[f1[i][j-1]][j-1];
f2[i][j] = f2[f2[i][j-1]][j-1];
}
}

  2.从S点找到最近的P1(s不一定是P1), 然后往上跳, 求Px。这一步可以在上一步记录每一个节点最近的P1;

   3.在T链二分能匹配第几个宝石, 对于每个Py, check的时候找到离T最近的Py往上跳(唉等等,这怎么找?总不能开个NM的数组在第一步记录吧?事实上可以离线来做, 再掉用一遍dfs, 搜索到某x点时,栈中就是每种颜色离x最近的 ,这个时候求出所有T为x的询问)


至于代码, 实现已经讲了就不放吧,没多长

其实是我tcl不想整理    

P7518 & 省选联考2021 宝石的更多相关文章

  1. [省选联考 2021 A 卷] 矩阵游戏

    很巧妙的一个构造. 我是没有想到的. 自己的思维能力可能还是不足. 考虑先满足\(b\)对\(a\)的限制,把\(a\)的第一行和第一列设\(0\),推出这个\(a\). 接下来考虑对这个\(a\), ...

  2. [省选联考 2021 A/B 卷] 卡牌游戏

    垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...

  3. [省选联考 2021 A/B 卷] 宝石

    大概是一眼看出来是这个给定序列在树上序列上按顺序跑最大匹配. 然后考虑维护向上和向下的链的值. 大概的做法是用倍增维护,考虑\(f_{u,i}\)是\(c_u\)在序列里的位置向后匹配\(2^i\)位 ...

  4. 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)

    洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\)​ \(10^9\)​ 的时代了吗?落伍了落伍了/ ...

  5. [省选联考 2021 A/B 卷] 图函数

    考虑到一件事情首先\(u -> u\)是可行的. 所以其实对于\(f(u,G')\) 只要考虑\([1,u]\)的点. 那么考虑其条件等价于\(u -> i\) 和 \(i -> u ...

  6. 洛谷 P7520 - [省选联考 2021 A 卷] 支配(支配树)

    洛谷题面传送门 真·支配树不 sb 的题. 首先题面已经疯狂暗示咱们建出支配树对吧,那咱就老老实实建呗.由于这题数据范围允许 \(n^2\)​ 算法通过,因此可以考虑 \(\mathcal O(n^2 ...

  7. 洛谷 P7515 - [省选联考 2021 A 卷] 矩阵游戏(差分约束)

    题面传送门 emmm--怎么评价这个题呢,赛后学完差分约束之后看题解感觉没那么 dl,可是现场为啥就因为种种原因想不到呢?显然是 wtcl( 先不考虑"非负"及" \(\ ...

  8. 题解 P6622 [省选联考 2020 A/B 卷] 信号传递

    洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...

  9. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

随机推荐

  1. 硬件交互 snmp 使用

    # *********************************snmp使用******************************************** # coding=utf-8 ...

  2. Kubernetes-5.Pod资源控制器(1)

    docker version:20.10.2 kubernetes version:1.20.1 本文概述Kubernetes Pod资源控制器的ReplicaSet.Deployment.Daemo ...

  3. 后端程序员之路 53、A Tour of Go-3

    #method    - Methods        - Go does not have classes. However, you can define methods on types.    ...

  4. [源码解析] 消息队列 Kombu 之 基本架构

    [源码解析] 消息队列 Kombu 之 基本架构 目录 [源码解析] 消息队列 Kombu 之 基本架构 0x00 摘要 0x01 AMQP 1.1 基本概念 1.2 工作过程 0x02 Poll系列 ...

  5. 单细胞分析实录(9): 展示marker基因的4种图形(二)

    在上一篇中,我已经讲解了展示marker基因的前两种图形,分别是tsne/umap图.热图,感兴趣的读者可以回顾一下.这一节我们继续学习堆叠小提琴图和气泡图. 3. 堆叠小提琴图展示marker基因 ...

  6. Java8的新特性--函数式接口

    目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...

  7. 【odoo14】第十五章、网站客户端开发

    odoo的web客户端.后台是员工经常使用的地方.在第九章中,我们了解了如何使用后台提供的各种可能性.本章,我们将了解如何扩展这种可能性.其中web模块包含了我们在使用odoo中的各种交互行为. 本章 ...

  8. API管理工具

    开源的api文档管理系统 api文档 php 在项目中,需要协同开发,所以会写许多API文档给其他同事,以前都是写一个简单的TXT文本或Word文档,口口相传,这种方式比较老土了,所以,需要有个api ...

  9. python ORM之sqlalchemy

    前沿对象关系映射ORM是在实际应用编程中常用到的技术,它在对象和关系之间建立了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化.简单来说就是开发人员在使用ORM模型编程时,不需 ...

  10. 在Windows下配置Linux远程开发环境

    在Windows下配置Linux远程开发环境 欢迎光临我的个人博客 https://source.chens.life/Configure-Linux-remote-development-envir ...