2021.11.15
https://ac.nowcoder.com/acm/contest/17797/K
两种操作 op1 加一层val的线段l到r op2询问包含在区间[l,r]的所有线段的最大差值
要求强制在线,m=1e5 n=3000
很秒的操作就是转为二维平面前缀max和min,把l,r分别作为x和y轴,我们每次查询希望是个前缀,也就是包含在[l,r]平面内的点都能有贡献,但是有个不好的地方就是l是递减的,刚好跟坐标轴是反着来,我们可以对称一下用N-l来add点,然后正常查询用二维bit就行了,二维bit可以用来查询二维平面从(0,0)开始的前缀max/min/和。
树上启发式合并
复杂度nlogn,南昌K,树上启发式合并套动态开点权值线段树。⚠️树上启发式合并要dfs两次,第一次类似树链剖分,找出重儿子,然后先遍历轻儿子,把轻儿子自己的贡献算上,清空轻儿子然后dfs重儿子,保留重儿子信息,然后加上轻儿子的贡献,如果flag==0把这个子树的贡献暴力删除。动态开点权值线段树,一般用来处理值域很大或者,有二维的问题(也就是有不同个root版本的)特别好用。
2021.11.16
切比雪夫距离 和 曼哈顿距离互相转化 洛谷松鼠的聚会,给定1e5个点求选定一个点,所有点到该点的切比雪夫距离和最小。
对于(x1,y1) (x2,y2)切比雪夫距离=max(x1-x2,y1-y2),曼哈顿距离=abs(x1-x2)+abs(y1-y2),对于切比雪夫距离上的所有点=((x+y)/2,(x-y)/2) 对于曼哈顿距离的所有点距离为((x+y),(x-y)),比如该题我们转化成曼哈顿距离直接秒杀。把x和y分别处理,排序维护就可以。
很好的博客
sosdp 处理子集问题的
sosdp技巧,复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)先枚举位数,再枚举状态,如果遇到要求补集的子集和,不好做的话,我们不如把0和1反一下,1代表不选,0代表选,用1来转移,能达到一样的效果。
N代表位数
for(int i=0;i<N;i++)
{
for(int j=0;j<(1<<N);j++)
{
//子集操作
if(j>>i&1) continue;
dp[j]=dp[j^(1<<i)]..
//超集操作
if(!(j>>i&1)) continue;
dp[j]=dp[j^(1<<i)]..
}
}
update:
线段树合并是个很神奇的算法,但是合并完一定要立马统计信息,不然会错误!!比如雨天的尾巴。
查询一个节点跟他有一样的k级父亲,可以反向考虑,把信息存到他的父亲上,父亲可以用倍增求,然后树上启发式合并的时候考虑父亲就可以了!如果正着做确实比较难考虑呀qwq。
2021 11 17 紫题100ac
https://www.luogu.com.cn/problem/CF1401F
在寄网课上学了线段树反转整体区间和交换区间,太牛了,flag直接定义在层数上,否则会TLE,也不用pushdown,之前不知道交换怎么维护,如果用rev维护那么pushdown就会错,但其实不pushdown就行了,还是太死板了。
我超
寄网实验课看到了一个线段树区间修改和sin求和,不知道咋弄,回顾一下高数
s
i
n
(
a
+
b
)
=
s
i
n
(
a
)
∗
c
o
s
(
b
)
+
s
i
n
(
b
)
∗
c
o
s
(
a
)
c
o
s
(
a
+
b
)
=
c
o
s
(
a
)
c
o
s
(
b
)
−
s
i
n
(
a
)
s
i
n
(
b
)
sin(a+b)=sin(a)*cos(b)+sin(b)*cos(a)\\cos(a+b)=cos(a)cos(b)-sin(a)sin(b)
sin(a+b)=sin(a)∗cos(b)+sin(b)∗cos(a)cos(a+b)=cos(a)cos(b)−sin(a)sin(b)
然后线段树维护区间sin和cos和lz,让我没想到的是lazy是可以叠加的,还是太呆了。
update: 2021.11.18
复习了一下点分治和cdq,cdq三维偏序,先保证时间,然后
x和y,考虑该层(l,mid)对(mid+1,r)这一部分的影响,通常用双指针和树状数组来维护修改。
点分治是每次换根的体现,维护子树之间的信息,只要找到个所有节点<=当前子树的sz/2就行了,可以保证最多递归nlogn层,然后每层计算就可以了。