随笔分类 - 数据结构--线段树
摘要:提要 看别人做的题找到的,联系一下最近做的两道CF和模拟赛题很自然地就会了。 一种不需要线段树分治的在线做法,但时空复杂度相对略高。 提示 一个显然的想法是考虑把“查询长度为 $K$ 的区间的最大值+次大值”变成“修改长度为 $K$ 的区间”。 如果所有插入操作和所有删除操作修改的区间相同,也就是只
阅读全文
摘要:A - Cookie Exchanges 看到这种题一般能想到直接枚举一定次数,不行就输出无解。 可以证明是 \(\log n\) 次,没想过证明。 B - Unplanned Queries 观察样例容易发现,或者这类题我好像见过类似的,结论就是如果所有端点都被取偶数次,那么就是可行的,反之不行。
阅读全文
摘要:题目 代码 首先容易想到对于所有的初始温度,其答案一定构成一段一段的区间,然后因为题目强制在线,可以想到每一天后就维护一下当前的答案集合。 容易发现,其实本质就是对于答案大于某一个数的所有数进行区间减,对于答案小于某个数的所有数区间加。(因为刚刚说了构成连续区间) 那么现在的问题就在于如何求出这两段
阅读全文
摘要:题目 分析 不难想到可以先按照 \(x\) 值排序,然后如果我们枚举每一个 \(x\) 值的装备,那么其在怪兽里面也一定是单调不降的。 这个时候就需要询问当前的怪兽当中,值小于当前 \(y\) 的怪兽个数。 直接每次加入怪兽,然后对于 \(y\) 就是个查询值域上的前缀和即可。 其实本质就是扫描线。
阅读全文
摘要:题目 CF1271D Portals 分析 直接讲 \(n\log n\) 做法,没看 \(dp\) 的 \(n^2\) 。 首先我们肯定可以想到这样的一个策略:先尽可能的多攻打,最后再回来考虑到底可以安插多少个获取得分。 而阻止我们安插的其实就是在当前点之后攻占所有城市需要的“已有兵力-需要兵力”
阅读全文
摘要:题目 CF1483C Skyline Photo 分析 首先看到这个题很明显可以序列上dp,设置状态很常规,就是前i个位置可以得到的最大收益。 关键是转移,考虑朴素的转移:\(dp[i]=\max\limits_{j=1}^{i}\{dp[j-1]+b[minpos]\}\) 然后考虑优化,这类需要
阅读全文
摘要:题目 给出很多个形如:\((l,r,a,b)\) 的操作,表示让区间 \([l,r]\) 当中的数变成 \(x\to (ax+b)\mod p\) (其中 \(p\) 是初始给定的。) 然后多次询问 \((l,r,pos)\) 表示询问:如果执行区间 \([l,r]\) 当中的操作,那么第 \(po
阅读全文
摘要:题目 CF431E Chemistry Experiment 分析 线段树上二分,二分答案,线段树。 首先,我们的目的是要求出尽可能小的最大体积,这显然是可以二分后直接判断的。 但是这样是 \(2\log\) 的,我们可以直接考虑线段树上二分。 可是这样就需要实数的线段树上二分了吗?并不是。 我们考
阅读全文
摘要:题目 CF145E Lucky Queries 给定一个序列,每一个数是 \(4\) 或者 \(7\) ,每次两种操作,翻转一个区间的 \(4,7\) 或者询问这个序列的最长不降子序列长度。 分析 经典的线段树维护的题目。 考虑维护区间内 \(4\) 的个数 ,\(7\) 的个数以及最长不下降子序列
阅读全文
摘要:题目 P4140 奇数国 同时质数的值在这个题目当中只会取到前 \(60\) 个。 分析 因为题目给出的性质,很难不让人想到直接对于每一个数来维护每一个质因子的次数。 于是直接线段树维护即可,欧拉函数要算就直接使用计算式来做即可。 代码 #include<bits/stdc++.h> using n
阅读全文
摘要:题目 分析 线性基有一个奇妙的性质: 于是我们可以把区间修改变成单点修改,然后就是直接线段树维护了。 时间复杂度 \(O(n\log{n}\log^2{V})\) 代码 #include<bits/stdc++.h> using namespace std; template <typename T
阅读全文
摘要:题目 分析 好像是叫:前缀线性基。 可以直接线段树做,三个$\log{}$的,也有两个的做法,这里介绍一种一个的做法。 直接在线性基里面多储存一个:当前这一位最右的位置。 维护就是:对于一个插入,如果当前位是1,并且位置更大,那么替换掉,把原本的当前位继续插入下去。 查询的时候就是如果当前位的有值并
阅读全文
摘要:题目 据传是什么毛毛虫树,实际上可以转化成一道原题。 分析 首先这个划分感觉很$LCT$,但是也可以树剖。 想到可以打时间戳,然后树剖维护“相邻两个数相同的对数”即可。 这里可以直接维护,同时也有一个转化:数颜色段数。 前者稍微麻烦,后者直接就是原题P2486 [SDOI2011]染色。 时间复杂度
阅读全文
摘要:题目 P5324 [BJOI2019]删数 分析 动态开店线段树+分析性质。 首先我们要找出这个删数操作的性质,也就是:显然题中数的顺序没有关系,于是可以直接在值域上来看,然后发现如果把数轴画出来再按照个数在每一个映射点向前映射,需要修改的数的个数就是数轴上空的个数。 那么现在考虑有修改操作的时候:
阅读全文
摘要:题目 P5327 [ZJOI2019]语言 分析 线段树合并+树上差分。 首先我们发现答案其实就是:对于每一个点来说的连通块大小之和。 那么现在问题在于怎么来维护这个连通块的大小。 我们可以考虑对每一个点开一个线段树,保存:\(dfn\) 序列对应的点被路径覆盖次数和长度。 然后对于这样一类树上路径
阅读全文
摘要:题目 BSOJ5606【2017山东三轮集训Day7】Easy 给定一棵树,每次询问:点 \([l,r]\) 当中距离点 \(x\) 最近的距离是多少。 分析 点分树+线段树。 点分树的基础应用,首先我们可以把这里点分树上面的线段树拿来维护编号为 \([1,n]\) 的所有结点的到当前点的距离最小值
阅读全文
摘要:题目 BSOJ1425&BZOJ4317 Atm的树 多次询问距离一个点的第 \(k\) 小距离。 分析 点分树+二分+线段树 首先,我们要明确的是,求第 \(k\) 小,是可以二分答案然后直接遍历判断个数的。 于是这就启示我们直接二分答案,那么这道题目就变成模板了,也就是求距离 \(x\) 小于等
阅读全文
摘要:题目 BSOJ1470&BZOJ4372 烁烁的游戏 分析 点分树+线段树 首先我们可以发现,这个和模板题的区别就是那里是单点修改区间查询,但是这里是区间修改单点查询。 于是在线段树上把这两个操作的对应区间反过来就好了。 具体可以见代码。 代码 #include<iostream> #include
阅读全文