随笔分类 - 数据结构——线段树
摘要:A.背包 problem 有$n$个物品,价值都小于等于13,Q次操作,每次操作给出$l,r$,问区间$[l,r]$内可以取任意多个物品,对于$k=0,1,2,...12$求出价值和$m% 13=k$的方案数对2取模。 然后将第l个物品和第i个物品价值和加1. \(n\le 8\times 10^6
阅读全文
摘要:比赛链接 A.旋转 problem 给出二维坐标系里的$n$个点。并且有$Q$次询问(操作)。 每次询问给出一个区间$[l,r]$。你需要回答一次询问并进行一次操作。 输出这个区间内所有的中心(中心就是所有点坐标的平均值)。 将$[l,r]$内的所有点绕中心逆时针旋转$60^{\circ}$ 所有询
阅读全文
摘要:题目链接 solution 为了方便,我们以小$z$的初始位置为根。 大概理解完题意,可以发现有一个比较显然的性质:每一回合结束,每个$Youyou$与小$z$之间的距离不会变大。 然后考虑小$z$移动所产生的影响。 考虑当小$z$开始移动时,如果小$z$从$u$移动到了$u$的一个儿子$v$。那么
阅读全文
摘要:题目链接 题意 给出一个长度为$n$的序列$a$,问有多少个区间$[l,r]$满足:在区间$[l,r]$内,$[1,r l+1]$的每个整数都恰好出现了一次。 $n \le 3 \times 10 ^ 5$,$a_i \le n$ 思路 可以发现,其实最后的答案一定不会很大。 所以:暴力出奇迹!!!
阅读全文
摘要:题目链接 思路 用$f(i,j)$表示前i个元素,以i为右端点,j为左端点时的答案。 用个"区间修改,单点查询"的线段树维护出第二维。在从左往右枚举i的过程中。将$[lst_i+1,i]$的答案+1.将$[lst_{lst_i}+1,lst_i]$的答案 1。 代码 cpp / @Author: w
阅读全文
摘要:题目 思路 首先按照$t$排序!!!! 首先考虑一个暴力$dp$ 用$f[i]$表示前$i$个人到达地点所需要的时间。 那么就有如下的转移 $$f_i = min_{1 \le j \le i}(max(f_j,t_i) + max\{w_{j + 1} ... w_i\} 2)$$ 这样复杂度是$
阅读全文
摘要:题目链接 思路 我们换一种求$dep[lca(i,j)]$的方法。 将从根到$i$的路径上所有点的权值加$1$,然后求从根节点到j路径上点的权值和。就是$i$和$j$的$lca$的深度。 以此类推,对于求$\sum\limits_{i=l}^rdep[lca(i,z)]$,我们可以对于从l到r中的每
阅读全文
摘要:题目链接 思路 对于每一种颜色都建立一个动态开点线段树。然后每次查询的时候就去这个颜色的线段树上查询就行了。修改之后不要忘记交换颜色。 这个题目数据有点强。抄了个比较快的读入优化才卡过去。 代码 cpp / @Author: wxyww @Date: 2018 12 13 08:59:51 @Las
阅读全文
摘要:题目链接 吐槽 这道题调了7个小时也是够了。最后只好比着题解做了一遍2333 思路 首先考虑n=2000的情况。因为这是在一条路径上,所以可以考虑差分。用a[i][j]表示第i个点中j这种粮食出现的次数。加入要在从x到y的路径上加入c这种粮食。将这条路径分为两部分进行差分。从x到lca,也就是将a[
阅读全文
摘要:前置知识 权值线段树&动态开点线段树 适用范围 有时候我们需要对权值线段树进行合并操作。然后就用到了线段树合并。一般是有很多棵线段树,然后需要将其中的两棵合并起来。 方法 其实方法很简单呢。就是分三种情况讨论一下。假设现在要将线段树a和线段树b合并。并且a成为合并之后的线段树。 如果a有当前子树,而
阅读全文
摘要:题目链接 题目大意 有一个矩阵,总共有4种操作 0:清空这个矩阵 1 x y c:将$(x,y)(1 \leq x ,y\leq 10^6)$这个点加上一种颜色c$(0\leq c \leq 50)$(注意是加上,也就是之前的颜色不会被覆盖) 2 x y1 y2:查询左上角为$(1,y1)$,右下角
阅读全文
摘要:权值线段树 所谓权值线段树,就是指线段树内存的是权值。~~好像是废话~~。给出一些数,要查询一个区间内的数的个数。这时可以用权值线段树,开个n(n为给出的数的最大值)个点的线段树。然后就能轻松的维护了~~当然树状数组更简单~~ 动态开点 为什么要动态开点呢?当然是因为空间不够啊。比如还是上面那个例子
阅读全文