树状数组
lushanlushan0026
退役acmer,准研究生
展开
-
HDU Tokitsukaze and Colorful Tree 离线+树状数组
因为是求异或值 显然我们需要将val进行二进制拆分 每一位单独去看 由求和式子我们知道 计算点对(u,v)的贡献时 v不能在u的子树中 v不能在 u到根结点的路径上由于修改都是单点修改 我们可以用树状数组进行差分操作具体的算法步骤就是:对于每一个颜色 我们枚举20位按照操作 顺序 我们将初始值视为一次加操作 将一次修改操作视为一次减操作和一次加操作计算将要修改的点的每一位的贡献 (用总的减去在子树中的 再减去在根结点到当前点的路径上的 即为满足条件的)然...原创 2020-07-31 18:31:20 · 155 阅读 · 0 评论 -
牛客多校训1 B Infinite Tree 虚树+数论+树状数组
第一场真的怀疑人生 做题做不动 补题补不动 还有叉姐的一句话题解 (看不懂啊呜呜呜) 然后我左翻右翻 终于找到了这题的题解 博主讲的非常详细 :Infinite Tree知道有虚树这个东西 但是还没看过 虚树的建树过程大概就是 先把所有需要的点拿出来(也有博客说这是叫啥 议事点) 显然这题我们需要的点 就是 1!,2!,3!,,,,,,,n! 这n个点 然后把他们按dfs序排序 所幸 这题按照1~n的顺序就是 dfs序排序的 我们找出每个点前面那个点的lca 最后...原创 2020-07-17 17:36:46 · 186 阅读 · 0 评论 -
P1527 [国家集训队]矩阵乘法 整体二分求二维第k小
#include<bits/stdc++.h>using namespace std;const int N = 503;int c[N][N],n,w;const int M = 4e5+100;int ans[M]; inline int in(){ int x=0;char c=0; while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<1)+(x&l.原创 2020-07-12 19:40:13 · 118 阅读 · 0 评论 -
CodeForces - 587E 和 无力回天NOI2017 线性基套路+线段树
这两个题十分相似 就放在一起讲了 它们的操作1都相同1 l r x 将区间l到r的数都异或x 这个操作似乎可以线段树区间修改 不过 2操作明显涉及到线性基 如果进行区间修改的话 线性基如何处理在这要用到线性基的一个套路当我们说两个线性基相同的时候 当且仅当它们可以异或出来的数相同 我们先对数组做一个异或差分 那么1操作就变成了l和r+1两处的单点修改 那2操作如何实现 我们观察一下 到这 r-l 个数 是不是可以将到...原创 2020-07-08 08:59:21 · 334 阅读 · 0 评论 -
GYM 102220 problem H Skyscraper 树状数组
将近一年前写的题目了 又翻出来看看题目链接:H Skyscraper思路:用线段树维护差分数组设b[i]=a[i]-a[i-1]如果 bi<=0 说明在完成i-1时可以顺便把i位置完成如果 bi>0 说明完成i-1后至少还需要bi才能完成那么我们维护两个树状数组第一个树状数组维护的是差分数组 bi 第二个树状数组维护的是ci(ci=bi && bi>0)修改操作就是常规的差分数组修改询问的话 就是也就是#i...原创 2020-06-26 21:31:54 · 242 阅读 · 0 评论 -
P4113 [HEOI2012]采花 莫队(个屁)or 树状数组
看着莫队的标签去写的 结果发现数据加强了 根本卡不过 后来想了想发现没什么好办法 看题解区 发现了一个树状数组的写法确实很有意思题意:给一个序列 对于每个询问区间 l~r 给出出现次数大于等于2的数的个数我们知道树状数组离线可以解决区间有多少个不同数的问题(也就是出现次数大于等于1的个数) 那出现次数大于等于2怎么写呢 显然要知道一个数是不是出现两次 我们需要知道这个位置的数 下一次在哪个位置出现(下文都以后继表示) 这个可以预处理一下我们把所有的询问按照左端点排序 一开始...原创 2020-06-18 10:38:34 · 125 阅读 · 0 评论 -
P3899 [湖南集训]更为厉害 树状数组离线二维数点
题意太长 不赘述考虑如何去求三元组(a,b,c)1.b是a的祖先 这个很好算 因为a的每个儿子都可以作为c 然后b和a的距离不超过k就行 显然就是2.a是b的祖先 这个才是这题的难度所在设tid[x]为x的dfs序如果a是b的祖先并且 依题意这就变成了一个二维数点的模型 以tid为x轴 dep为y轴 那不就是在矩形 (tid[a],dep[a]), (tid[a]+siz[a]-1,dep[a]+k)里面有多少个点吗 对于每个合法的b点 ...原创 2020-06-14 15:58:09 · 144 阅读 · 0 评论 -
HDU - 5788 Level Up 主席树+树状数组
我们先说明几个结论:一个人的能力变化只会影响自己和上司 当变化的下属的能力小于等于上司的中位数 那么这个中位数会向后移动一位 否则不变 (这个画图就能体会到)所以我们需要用主席树去查询 第mid个能力值 和 第mid+1个能力值 用树状数组去维护差值 枚举每一个点 并记录可以获得的最大差值 最后答案就是初始的能力值之和+最大差值 具体可以看代码解释#include<cstdio>#include<cstring>#include<algorithm>.原创 2020-05-21 19:56:54 · 310 阅读 · 0 评论 -
ZOJ - 2112 Dynamic Rankings 树套树(树状数组套主席树)
要理解这题的话 首先得理解一下主席树上面的前缀和思想 我们求区间L~R第k小的时候 是用R这颗树的值减去(L-1)这棵树的值 这其中暗含了 L~R的数值在值域上的分布(瞎说) 通过这个分布我们可以向第k小靠拢 R和L-1的差值 这不是显然的前缀和思想吗 那普通的主席树我们其实可以看成数组的前缀和 当我要知道 区间L到R的值时 我就访问 R和L-1的差值 并且这是不带修改的...原创 2020-05-05 20:28:39 · 180 阅读 · 0 评论 -
HDU 5542 树状数组优化dp
这是个计数的问题,我们考虑dp方程表示长度为 i ,以 aj 结尾的严格上升子序列的个数显然: 其中 k < j && a[ k ] < a[ j ]朴素代码:scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++) scanf("%d",&a[i]); mems...原创 2020-04-19 14:48:22 · 260 阅读 · 0 评论