首页 > 其他分享 >230928 做题记录 // 超级 NB 线段树

230928 做题记录 // 超级 NB 线段树

时间:2023-09-28 16:15:08浏览次数:37  
标签:颜色 NB 枚举 端点 区间 230928 线段

最近特别喜欢用 NB 这个词。这是为什么呢?

因为我太 NB 了。我怎么这么厉害呢?我好想朝所有人都嘚瑟嘚瑟!我真 NB!

先开题吧。


A - 等差子序列

https://vjudge.net/contest/583230#problem/A

非常 NB 的一道线段树!但是现在没空所以先不写。


B - 颜色

https://vjudge.net/contest/583230#problem/B

颜色删完过后剩下的肯定是一段区间。

那么区间外的所有颜色都会被删掉,如果要满足题目条件的话,删掉的颜色不能出现在区间内。

那么就可以有这么一个题意的转化:寻找区间的个数,满足区间内的颜色只出现在区间内。

然后你可能就要问了,不是还要满足区间外的所有颜色都不出现在区间内吗。但是你想想,要是它出现在区间内了,它作为区间内的颜色,不就不满足我们上面说的那条规则了吗。

这个转化是非常厉害的。那么这个时候有一个显而易见暴力做法,我们记录一个颜色在整个序列中出现的第一个位置(记为 \(L_x\))和最后一个位置(记作 \(R_x\)),然后枚举每一个区间 \([i, j]\),再枚举其中的每一个颜色,看看有没有超出去就好,复杂度 \(\mathcal O(n^3)\)。

对纯暴力的一点小优化 上述区间内枚举过程转化为判定区间是否满足 ${L_x}_{\min} \ge i$ 且 ${R_x}_{\max} \le j$,采用数据结构维护,就可以优化到 $\mathcal O(n^2\log)$。为什么要专门提一嘴这个呢,因为这个模型我没想到。我真 NB。

接下来又是一个我想不到的模型。我们发现复杂度瓶颈出在枚举区间上,所以考虑通过固定区间右端点,用较小的复杂度直接求解满足条件的左端点数量来解决问题。为什么不是固定左端点呢?

「因为题解都是写的固定右端点。」 0# 如是说。

对于正在枚举的右端点 \(j\) 右边的颜色 \(x\),我们记录它们上一次出现的位置 \(p_x\),并用线段树找到范围内最右值 \((p_x)_{\max}\),那么左端点 \(i>(p_x)_{\max}\)。取 \(i'=(p_x)_{\max}+1\),这样我们就初步得到了一个 \([i', j]\)。相对于纯暴力的做法,\(R_x\le j\) 的等价条件已经满足,但还有一个条件,就是 \(L_x\) 不能小于 \(i\)。

为了方便数据结构维护 \(p_x\),我们逆序枚举 \(j\),这样又可以得到一个性质:\(i'\) 单调不降。这个时候我们逆向思维,处理出对于每个 \(i\ge i'\),其能够到的最远的 \(j\),记为 \(f_i\),那么我们对于 \(f_i\) 建一个权值线段树,然后在枚举过程中查询权值在 \([j, +\infty)\) 的 \(i\) 的个数就是答案。由于求的是个数,所以可以对超出范围的 \(i\) 对应的 \(f_i\) 进行删除操作。

那么 \(f_i\) 又该怎么求呢?暴力地再建一个权值线段树维护 \(L_x\),在 \((-\infty, i)\) 权值范围内查询下标 \(k\) 的最小值,此时的 \(k\) 就是 \(f_i\)。

因为 0# 讲课的时候我在开飞机,所以我也不知道 0# 是不是这么讲的,总之我这么做应该能做出来,就是要维护的东西实在有亿点点多。

但是注意到一个线段树和两个权值线段树维护的大区间其实是一样的,所以我们只用一个线段树同时维护三个信息就好。最后时间复杂度 \(\mathcal O(n\log n)\)。

标签:颜色,NB,枚举,端点,区间,230928,线段
From: https://www.cnblogs.com/XSC062/p/17735984.html

相关文章

  • 线段树分治&可撤销并查集
    可撤销并查集按时间顺序用一个栈维护合并信息,撤销时从栈顶弹出合并信息,恢复原状态。并查集查找祖先时不能路径压缩,只能按秩合并。例题:[ABC302Ex]BallCollector容易想到将\(A_i\)和\(B_i\)之间连边。遍历整棵树,用可撤销并查集维护图。为了进一步求得答案,需要注意到该......
  • 【230928-2】当α∈[0,PI/2],求:y=(5-4Sinα)^0.5+Sinα的极值=?
    指定α范围的函数图像:不指定α范围的函数图像:END......
  • 【230927-7】若▲ABC的三个内角满足SinA:SinB:SinC=5:11:13,则▲ABC为(锐角/直角/钝角)
    ......
  • 根据一个数组,创建一个Segment Tree(线段树)
    线段树的特点线段树的优势线段树的构造过程(0,5)37:数组元素下标0~5的元素之和是37(0,2)21:数组元素下标0~2的元素之和是21线段树的基本数据结构(结点结构由五个分量组成)运行结果(C语言代码)递归的创建一颗线段树,然后中序、先序、后序遍历这个结点#include<stdio.h>#include<st......
  • 中国电信 NB-IoT 翻频方案及操作指导
    中国电信800MNB-IoT翻频方案说明:翻频前频点分布如下图所示,对应中心频点为879.4/.6/.8MHz或879.5/.7/.9MHz翻频前频点信息:BAND52504,2506,2508  翻频后频点下移分布如下图所示,对应中心频点为869.1/869.3/869.5MHz位置,翻频后频点信息:BAND52401,2403,2405 ......
  • Unbiased Knowledge Distillation for Recommendation
    目录概UnKD代码ChenG.,ChenJ.,FengF.,ZhouS.andHeX.Unbiasedknowledgedistillationforrecommendation.WSDM,2023.概考虑流行度偏差的知识蒸馏,应用于推荐系统.UnKDMotivation就不讲了,感觉不是很强烈.方法很简单,就是将按照流行度给items进行......
  • 线段树复习
    1.楼房重建经典题。先转化题意,将斜率转化为每个点的权值,发现答案是单调递增的。那么就是求单点修改的最长上升子序列。用线段树维护两个信息当前区间的最大值mx,当前区间最长上升子序列长度len。修改时单点修改即可,考虑如何合并两个区间的len。可以在线段树上二分。get(o,k)......
  • PostgreSQL教程:JSON&JSONB类型
    JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。PGSQL支持JSON类型以及JSONB类型。JSON和JSONB的使用基本没区别。撇去JSON类型,本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验......
  • 2023湖南省赛 E.ytree (线段树)
    传送门大致思路:1.将操作1拆分为两个部分x(-1)^d+kd(-1)^d。对于操作1中的x(-1)^d部分而言。我们可以对式子进行拆分,把x拆出来,我们会发现和v号点距离为奇数的点会减去x,为偶数的点会加上x,所以我们可以在线段树上用一个sum1维护应该减去的值,sum2维护加上的值即可。2.随即就是......
  • 【转载https://www.cnblogs.com/niuben/p/12017242.html】Linux top命令详解
    Linuxtop命令详解转载出处:https://www.cnblogs.com/niuben/p/12017242.htmltop参数详解第一行,任务队列信息,同uptime命令的执行结果系统时间:07:27:05运行时间:up1:57min,当前登录用户:3user负载均衡(uptime)loadaverage:0.00,0.00,0.00average后面的三个数分......