一些常见?小技巧
一.区间查询
形如 [ l , r ] [l,r] [l,r]( l ∈ [ 1 , n ] , r ∈ [ l , n ] l\in[1,n],r\in [l,n] l∈[1,n],r∈[l,n])的序列统计问题,常使用枚举左端点,快速计算对应的右端点的总答案的方式。
例如洛谷P6477 [NOI Online #2 提高组] 子序列问题
先不考虑重复,那答案则显而易见,然后去重
枚举左端点l,明显[l,r]中有s个重复时答案为
(
r
−
l
+
1
−
s
)
2
(r-l+1-s)^2
(r−l+1−s)2
对于每个重复点都会对后面的重复点造成s+1的影响,可以用线段树统计
将其暴力拆成
(
r
−
l
+
1
)
2
−
2
∗
s
∗
(
r
−
l
+
1
)
+
s
2
(r-l+1)^2-2*s*(r-l+1)+s^2
(r−l+1)2−2∗s∗(r−l+1)+s2
可以看到我们可以
O
(
1
)
O(1)
O(1)统计
2
∗
s
∗
(
r
−
l
+
1
)
2*s*(r-l+1)
2∗s∗(r−l+1)
而
s
2
s^2
s2可以
O
(
l
o
g
n
)
O(logn)
O(logn)统计
二.序列性质
形如 [ l , r ] [l,r] [l,r]是否为连续上升/下降序列,n的排列等询问,可以结合哈希乱搞。对于每个点的值进行哈希,最后统计3个或以上的总和与目标的哈希综合比较即可。
比如洛谷P3792 由乃与大母神原型和偶像崇拜
只要维护和,平方和,三次方和/异或和/幂次和就能够通过。
这里推荐幂次和,底数和模数都取大质数。
三.线段树建图
就是用来优化出现了i要对一段连续区间连边的情况,可以用线段树建图减少边数。
然后一般就是缩点图论。
例如洛谷P5025 [SNOI2017]炸弹
将能炸到的在线段树连边建图,跑缩点然后dfs统计。
最后的那个DAG统计能到达结点权值和比较新奇,因为是区间就可以统计最小大值做差,避免了世纪难题。
四.扫描线
不是太清楚,大概就是一种排序一维线段树/树状数组维护第二维的玩意。
例如洛谷P4088 [USACO18FEB]Slingshot P
按x排序后树状数组统计答案
绝对值拆成四种情况取最值即可。
关于二维数点问题有时也可以看作偏序用CDQ解决。
五.标记永久化
感觉一般没什么用啊,除了卡卡常(
大概就是不下传标记,询问的时候加上标记的整一段区间对答案的贡献即可。
莫得例子。