题目链接 一 核心: f(x)=91 (x<=100) f(x)=x-10 (x>100) 那么同一区间就可能不同的操作,那么该怎么解决呢? 我门直到同一区间的数据属于同一类别的时候再进行懒惰标记 区间记录最大值_max  最小值_min(同时应该有两个懒惰标记) 1) 最大值大于100 全部减去10 2)最小值小于等于100 全部变成91 注意懒惰标记的顺序,(2)应该在后面,想一想啊! 二 代码 /* f(x)=91 (x<=100) f(x)=x-10 (x>101) */…
题意: 已知\(n\)个数字,进行以下操作: \(1.\)给一个区间\([L,R]\) 加上一个数\(x\) \(2.\)把一个区间\([L,R]\) 里小于\(x\) 的数变成\(x\) \(3.\)把一个区间\([L,R]\) 里大于\(x\) 的数变成\(x\) \(4.\)求区间\([L,R]\)的和 \(5.\)求区间\([L,R]\)的最大值 \(6.\)求区间\([L,R]\) 的最小值 思路: 吉司机线段树. 假如我们要进行把一个区间\([L,R]\) 里小于\(x\) 的数变成…
线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来,单次时间复杂度严格\(O(\log n)\). 至于又有合并又有分裂的复杂度,蒟蒻一直不会比较有说服力的证明,直到看见SovietPower巨佬的题解 对于只有合并:合并两棵线段树的过程,是找到它们\(x\)个重合的节点的位置,并将它们合并,而对于不重合的节点会跳过. 注意到合并与分裂类似互逆过程,…
题目链接 吉司机线段树裸题... #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f3f3f3f3f; ll n,m,a[N],mx[N<<],se[N<<],nmx[N<<],lz[N<<]; ll sum[N<<]; #define ls (u<<1) #define rs (u<<1|1) #…
题目链接 题意:在一条直线上依次建造n座建筑物,每座建筑物建造完成后询问它在多长的部分是最高的. 比较好想的方法是用线段树分别维护每个区间的最小值mi和最大值mx,当建造一座高度为x的建筑物时,若mi>x则答案无贡献,直接退出,若mx<=x则区间赋值为x,答案加上区间长度.其他情况需要继续递归搜索. #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],mi[N&l…
题意 题目链接 Sol 传说中的吉司机线段树??感觉和BZOJ冒险那题差不多,就是强行剪枝... 这题最坑的地方在于对于操作1,$C >= 0$, 操作2中需要对0取max,$a[i] >= 0$,这不就是统计最小值出现的次数么?? 按照套路 维护好区间赋值标记 / 区间加法标记 / 区间max标记 / 区间最小值 / 区间最小值出现的次数 / 区间次小值 对于第二个操作就拆成区间加 和 区间max 区间max是一个很神奇的操作 设当前加入的数为val 若val>=mn,那该操作对该区间…
题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 赋值为\(x\) \(2.\)区间\([L,R]\) 赋值为\(max(a[i] + x, 0)\) \(3.\)区间\([L,R]\) 询问\(0\)个数 已知初始值\(\geq 0\),\(x\geq0\). 思路: 吉司机线段树. 操作\(1\)可以直接打覆盖标记. 操作\(2\)可以分为两步:区间加\(x\),然后取区间\(max(a[i],0)\). 操作\(3\)只要维护最小值的个数,因为不管怎么操作最…
题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 按位与\(x\) \(2.\)区间\([L,R]\) 按位或\(x\) \(3.\)区间\([L,R]\) 询问最大值 思路: 吉司机线段树. 我们按位考虑,维护区间或\(\_or\)和区间与\(\_and\),那么得到区间非公有的\(1\)为\((\_or \oplus \_and)\),那么如果对所有的非公有的\(1\)影响都一样就不会对最大值有影响,那么就直接打标机,否则继续往下更新.即 \[[(\_or[r…
题意:给出a,b数组,区间上两种操作,给\(a[L,R]\)+1s,或者求\(\sum_{i=l}^{r}a_i/b_i\) 一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好 维护区间a的最大值和b的最小值,如果存在相交的部分则证明可能产生新的贡献, 此时暴搜到叶子把可能的a置回0并加上贡献就好 然后疯狂TTTT 网上搜了一波题解好像说是会改变lazy的判断?(虽然觉得没有道理但是我认(怂)了 于是换一种策略,既然lazy依赖与a的最值,那我们尽量不碰它,改为b的值翻倍 然后过了 算学到了…
4127: Abs Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 381  Solved: 132[Submit][Status][Discuss] Description 给定一棵树,设计数据结构支持以下操作 1 u   v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 Input 第一行两个整数n和m,表示结点个数和操作数 接下来一行n个整数a_i,表示点i的权值 接下来n-1行,每行两个整数u,v…