随笔分类 - 数据结构 / 线段树
摘要:好久没有做过这么巧妙的题目了,开心捏O(∩_∩)O~ 由于传送的 \(y,z\) 坐标自选,所以实际上对于一个点给出的坐标 \((a_i,b_i,c_i)\) 以及这个点调查的花费 \(cs_i\),我们只需要维护 \(a_i,cs_i\) 即可。那么设规定的 \(x\) 值为 \(x_0\),那么
阅读全文
摘要:设加入的第 \(i\) 个向量为 \((a_i,b_i)\),询问的向量是 \((x,y)\),则有(下假设 \(a_i>a_j\)): \[a_ix+b_iy>a_jx+b_jy \]\[-(a_i-a_j)x<(b_i-b_j)y \]\[\begin{cases} \dfrac{b_i-b_j
阅读全文
摘要:这题一脸 01 分数规划的长相,考虑对答案进行二分。 设最大答案为 \(cmax\),则当 \((-x_ic+y_i)+(-p_jc+q_j)\ge 0\) 时,\(c\le cmax\)。不等式左半侧前后两个部分相互独立且解法相近,可以分别处理。我们只考虑 \(-x_ic+y_i\) 的最大值,这
阅读全文
摘要:名字感觉挺奇怪的。 考虑离线算法。首先答案就是用 \(n\) 减去连完边后的生成树森林边数。生成树当然就可以用 \(lct\) 求解了。我是不会告诉你这个时候我已经开始想回滚莫队了的。 考虑当我们倒序加入 \([l,r]\) 中的边时,哪些边会产生贡献。我们考虑假如我们新加入一条边,与原先的生成树形
阅读全文
摘要:妙不可言!妙绝人寰! 单点修,区间查,包是线段树的。考虑如何比较两节点大小。 考虑二叉搜索树,我们只要再给每个节点附一个权值,就可以比较了! 注意力相当惊人的注意到,假如给每个点一个区间 \([l_x,r_x]\),左右儿子分别表示为 \([l_x,\lfloor\frac{l_x+r_x}2\rf
阅读全文
摘要:突然想买一瓶,然后喝上几口。(不要命的想法) 动态全局 \(k\) 大想到权值线段树上二分。 由于要存储二维的点,所以得用到我们神通广大的 \(KDT\) 了。 那么想到权值线段树套 \(KDT\) 这种算法了。 笔者用的是二进制分组的写法,插入单次均摊时间复杂度是 \(O(\log^3n)\),查
阅读全文
摘要:\(55+42+50=147,rk2\)。 T1 序列 直接上吉司机线段树,特判 \(+\ 0\) 情况即可。 我猜测时间复杂度是 \(O(n\log^2n)\)。 #include<bits/stdc++.h> #define int long long using namespace std;
阅读全文
摘要:好题,又学两个思路。 先把问题变简单一点,去掉深度限制,那么有两种做法: 经典的前驱后继转化到二维数点。 颜色相同的点按 \(dfs\) 序排序,每个点 \(+1\),相邻两点 \(lca-1\)。转化为区间求和。 第二种相对实现简单。 假如加上深度,我们可以离线问题,按深度顺序加点。 要在线的话,
阅读全文
摘要:首先 \(S(u)\) 显然是 \(u\) 的子树。 假如 \(u\) 是定点,问题转化为区间求平方和,十分简单。 于是我们用线段树维护区间平方和,支持区间加,然后离线问题,在 \(u\) 的位置处理即可。线段树从 \(fa\) 转移到 \(u\) 是极度简单的。 时间复杂度 \(O(n\log n
阅读全文
摘要:考虑当没有强制在线时,容易想到一个点 \(i\) 所影响的区间 \([l,r]\) 满足 \(pr_i<l\le i,i\le r<nx_i\)。显然可以转化为矩阵修改,单点求 \(\max\) 的问题。那扫描线 \(+\ set\) 轻松拿下。 强制在线就把线段树换成主席树就可以了。注意这里不能下
阅读全文
摘要:函数复合,直接转化为离线问题,那我们就需要完成对满足条件的量的区间加操作。 显然 \(ans_{[l,r]}\ge ans_{(l,r]}\),所以可以线段树二分。 时间复杂度 \(O(q\log n)\)。 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:相当套路而巧妙的构造。 假如我们对于横纵坐标构造二分图,然后用如下方法连边: 对于点 \((x,y)\),连接 \(x,y\)。 那么对于一个有 \(num_x\) 个横坐标点和 \(num_y\) 个纵坐标点的连通块,它所产生的贡献就是 \(num_x\times num_y\)。 这玩意儿需要联
阅读全文
摘要:模版题的升级了。 使用二分图经典判定方法(一个点拆成两个点 \(x,x+n\),连边 \((x,y)\) 就是连接 \((x,y+n),(x+n,y)\),那么是否是二分图就等价于判断 \(x,x+n\) 是否都不在一个集合内),预处理出每个操作的 \(e_i\) 下一次出现的位置 \(nx_i\)
阅读全文
摘要:注意力惊人的注意到我们可以将问题转化为所有联通块大小全部为偶数。 假如已经确认了所有加入的边,那么我们可以通过类似 \(K\) 算法的方式求解。 考虑到答案单调不升,所以每条边都有一个影响的区间。考虑线段树分治。 我们倒序枚举,遇到要加入的边,若当前时间为 \(t\),边的加入时间为 \(t'\),
阅读全文
摘要:一、线段树分裂 类似于 \(FHQ-Treap\) 的方式,下给出模板题代码。 //Luogu5494 #include<bits/stdc++.h> #define int long long using namespace std; const int N=2e5+5,M=5e6+5; int
阅读全文
摘要:众所周知,\(Li\ Chao\ Tree=LCT=Link\ Cut\ Tree\)。 在我们的日常学习生活中,经常会遇到以下问题: 维护一种数据结构,要求: 添加一条线段 求解 \(x=k\) 与所有线段交点中,\(y\) 最大的一个。 众所周知,线段会影响一个区间的答案。区间取 \(max+\
阅读全文
摘要:考试压轴题,意识到这题是线段树优化 \(dp\) 时追悔莫及。 为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。 想到设 \(dp_{i,j}\) 表示在第 \(i\) 层,奶牛们在 \(j\) 列时的最小移动范围,则转移方程为(设输入为 \(l,r\)): \[\
阅读全文
摘要:不愧是 \(ZJOI\),《最可做的一道题》都让人一头雾水…… 首先将问题转化到链上。 可以将总共的组数转化为每个点可以到达的城市。 明显给每个点建一棵动态开点线段树,维护可以和他通商的点。很明显,可以通商的点的标号连续的一段。我们可以将可以将每一次传播语言的工作当作区间修改,很明显可以用差分。最后
阅读全文

浙公网安备 33010602011771号