随笔分类 - ACM / 线段树与树状数组
摘要:原题链接 考察:二分+树状数组 只想到了暴力做法...最关键的从左往右和从右往左取min没想到. 思路: 队列模拟成n个空位,因为只需要考虑比当前高的,且按字典序,我们将身高排序,对于$h_i$,有&k_i&个比他高的 (1)如果在前面,那么他的位置是第$k_i+1$个空位 (2)如果在后面,位置在
阅读全文
摘要:原题链接 考察:线段树 or RMQ + 离散化 错误思路: 对于查询中,没给出降雨量的年份,假定降雨量为0,再建立线段树. 错误原因: maybe的依据是区间最小值为0,但是即使有不确定的年份也可以确定false,而且插入虚点了就不方便判定中间值与$l,r$的大小情况. 正确思路: 对于每个查询,
阅读全文
摘要:原题链接 考察:线段树 or 思维+RMQ ####思路一: 用线段树解法比较容易理解.$cnt$记录$[l,r]$区间的最大次数.它可以由子区间的cnt推来,如果左子区间的右端点 = 右子区间的左端点,那么也可以由左子区间的右连续最大长度+右子区间左连续最大长度推来. 需要注意的是查询和push_
阅读全文
摘要:原题链接 考察:线段树+最短路 思路: 线段树优化建边的模板题,基本参考了大佬博客,私以为这个是讲得最好的. GO 关于为什么出树是由子到父,因为入树必然是父节点到子节点,而为了搭配入树只能是子节点到父节点. ##Code #include <iostream> #include <cstring>
阅读全文
摘要:原题链接 考察:树状数组 错误思路: 按顺序加入线段,对于每个线段左右端点,求min(左端点往上的个数,右端点往下的个数),min(左端点往下的个数,右端点往上的个数) 错误原因: 当数据出现: 1 1 3 3 2 2 就会计算错误. 思路: 排序,按左端点排序,求右端点的逆序对. ##Code #
阅读全文
摘要:原题链接 考察:线段树 思路: 如果做过校门外的树(增强版)那道题,应该可以想到是建立两个线段树.一个维护基友和女神约会时间tr[0],一个维护女神时间tr[1]. 对于基友相约t,我们求出tr[0]的t个空白时间的最左端点,然后更新tr[0];对于女神相约t,先求出tr[0]的左端点,没有就求tr
阅读全文
摘要:原题链接 考察:线段树 思路: 和校门外的树(增强版)那道题差不多,我们不用管哪些瓶子有花,哪些没有.只要add,范围内从小到大 = 1.只要删除,sum[l,r] = 0. #Code #include <iostream> #include <cstring> using namespace s
阅读全文
摘要:原题链接 考察:线段树 思路: 维护序列的扩展版. 1操作 : 区间修改 2操作 : 区间修改 3操作 : 类似线段树染色的区间修改. 4操作 : 区间查询. 对于操作1,2,3考虑每个操作如何影响需要维护的平方和,立方和. 原平方和: a2+b2+c2+... 操作1后: (a+x)2+(b+x)
阅读全文
摘要:原题链接 考察:线段树 思路: 线段树染色+dfs序. 关于dfs序的讲解GO! ##Code #include <iostream> #include <cstring> using namespace std; const int N = 50010; int n,sz[N],h[N],idx,
阅读全文
摘要:原题链接 考察:线段树 完全没思路,乍一眼看还以为是并查集. 大佬的思路: D操作:单点修改 R操作: 单点修改 Q操作: 区间查询 我:??? 思路: 这道题求最大的连通数的思想有点类似这题Imbalanced Array CodeForces - 817D 因为村庄都是一维的,所以最大连通数一定
阅读全文
摘要:原题链接 考察:线段树(扫描线) 三维扫描线求重合>=3次的体积. 完全没想出来三维怎么推,结果发现是切片(.) 思路: 从小到大枚举z.求平面在枚举z范围内的重合>=3次的面积.ans累加即可. 这里求重合>=3次的不能用之前的懒标记法了.每个点遍历1000*2*N遍会TLE.因此采用更好的优化思
阅读全文
摘要:原题链接 考察:线段树 扫描线求周长 思路: 以x轴为例,先看图. 由此就比较好求了.这里cnt有值就可以贡献长度,所以可以不用push_down. Code #include <iostream> #include <cstring> #include <algorithm> #include <
阅读全文
摘要:原题链接 考察:线段树(扫描线) 通过本题终于稍微弄懂点扫描线了. 思路: 之前的HDU 1542 Atlantis.因为只要在修改前出现过一次就会被计入长度.且区间总是成对出现,也就是不用处理新的区间. 本题只有出现次数>1才会被记录有效长度,此时在修改前需要处理新出现的cnt>1的区间.即需要将
阅读全文
摘要:原题链接 考察:线段树+剪枝 思路: 参考大佬的思路.线段树也能剪枝是我没想到的. 最大的数263最多开方6次就会变成1.考虑到这点可以考虑暴力.每次修改[l,r]实际转化为单点修改,但是要进行剪枝,如果当前区间的最大值已经 = 1,那么就没必要在往下搜. 时间复杂度最坏是O(6*4*N+1e5*l
阅读全文
摘要:原题链接 考察:线段树 思路: 还是线段树染色问题.. 但还是和上一题有点区别,单以样例1来说: 5 0 4 4 > 1 5 5 0 3 1 > 1 4 2 3 4 2 > 4 5 3 0 2 2 > 1 3 3 0 2 3 > 1 3 4 颜色与我们定义线段树区间颜色表示相冲突,所以进行坐标偏移.
阅读全文
摘要:原题链接 考察:线段树 线段树染色问题 思路: 每次张贴海报都是一次区间修改.而染色区间l,r范围过大.需要离散化.离散化后就可以定义线段树了. struct Node{ int l,r,c;//l,r左右端点.c为该区间的颜色,同时也是懒标记 }tr[N<<3]; 这里定义c为该区间颜色种类是不可
阅读全文
摘要:原题链接 考察:线段树 or 模拟 模拟是很简单啦,主要考虑线段树怎么写,本题的线段树比较特殊. 思路: 基本是参考了大佬的题解.本题的懒标记过于特殊把我写懵了.... 操作 0:砍掉[l,r]区间的树与树苗 操作 1:种植[l,r]区间的树苗. 抽象到线段树操作就是 0: [l,r]区间 树数组-
阅读全文
摘要:原题链接 考察:线段树 思路: 很明显是设置两个懒标记,tag_1标记修改的累加和,tag_2标记修改的累乘积.但是直接这么写会WA,原因是具有运算优先级.假设修改区间为s,s*c1+c2 与 s*c2+c1是完全不同的结果. 需要统一运算优先级.也就是规定先乘还是后乘.如果我们后乘,即(s+c)*
阅读全文
摘要:原题链接 考察:线段树(扫描线) 思路: 其实是扫描线入门题.(然后就看了很久才略懂) 本题思路还是直接看大佬博客吧GO 想解释的只有几个问题. 为什么结构体如此定义? struct Node{ int l,r,cnt;//实际代表含义是[l,r+1]区间 double len;//cnt是指该区间
阅读全文
摘要:原题链接 考察:线段树 思路: 第一个操作:表示把 A[l],A[l+1],…,A[r] 都加上 d.显而易见的差分优化为单点修改. 第二个操作:求[L,R]区间的gcd. 通过这两个操作思考怎么定义结构体.模板L,R然后很明显需要一个变量val记录[L,R]区间内的gcd.但是如果我们把线段树维护
阅读全文