区间满足条件的子区间计数
区间满足条件的子区间计数
一般是扫描线,可能会有线段树维护历史版本信息。
CF526F Pudding Monsters
题意:给定一个 \(n \times n\) 的棋盘,其中有 \(n\) 个棋子,每行每列恰好有一个棋子。对于所有的 \(1 \leq k \leq n\),求有多少个 \(k \times k\) 的子棋盘中恰好有 \(k\) 个棋子。
思路:首先是一步转化,即把条件变成\(r-l=max-min\),正确性显然,于是转成了一维的问题。
考虑分治。当前要求的是跨过\(mid\)的合法区间数。于是分类讨论,如果最大、最小值都在某一侧,那么就相当于是\(j=i+maxn[i]-minn[i]\)或者\(j=i-(maxn[i]-minn[i])\),可以直接判断是否合法。另一种是最大、最小值不在同一侧,那么就有$minn[i]+i=maxn[j]+j \(或者\)minn[i]-i=maxn[j]-j $,可以直接双指针求解。写起来有些细节。
CF1004F Sonya and Bitwise OR
题意:单点修改,求一个区间有多少子区间满足按位或和至少为 \(x\)。
思路:类似 [Ynoi2014] 不归之人与望眼欲穿的人们 的做法,不过直接用线段树就是\(O(n\log a+m\log n\log a)\)的,而且比较好写。
CF997E Good Subsegments
题意:有一个\(1-n\)的排列\(P\),如果区间\([l,r]\)中的数是连续的,那么我们称它为好区间。有\(q\)次询问,每次问\([l,r]\)内,有多少子区间是好的?
思路:一道线段树维护区间历史贡献加和的题。
考虑把原条件转化成求有多少区间满足 \(max-min-(r-l)=0\)。然后考虑扫描线,然后用线段树维护区间最小值及最小值的历史出现次数。
具体的维护方法是设 \(sum\) 表示当前区间的最小值的历史出现次数,\(cnt\) 表示当前区间的最小值出现次数要对历史出现次数的贡献,然后下传标记时先下传加法标记然后下传对历史出现次数的贡献即可。
CF1609F Interesting Sections
题意:求有多少子区间满足最大值的 \(popcount\) 等于最小值的 \(popcount\)。
思路:有好多做法,写的是 tzc_wk 的扫描线做法。
考虑每次把 popcount 相同的位置当做关键位置,然后就相当于是有多少区间的最大值和最小值都是关键位置,于是记 \(f_l\) 表示 \([l,r]\) 的最大值是否是关键位置 + \([l,r]\) 的最小值是否是关键位置,然后就相当于是求最大值及出现次数,修改就是区间修改,于是可以用线段树维护。