区间满足条件的子区间计数

1|0区间满足条件的子区间计数

一般是扫描线,可能会有线段树维护历史版本信息。

1|1CF526F Pudding Monsters

题意:给定一个 n×n 的棋盘,其中有 n 个棋子,每行每列恰好有一个棋子。对于所有的 1kn,求有多少个 k×k 的子棋盘中恰好有 k 个棋子。

思路:首先是一步转化,即把条件变成rl=maxmin,正确性显然,于是转成了一维的问题。

考虑分治。当前要求的是跨过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 $,可以直接双指针求解。写起来有些细节。

1|2CF1004F Sonya and Bitwise OR

题意:单点修改,求一个区间有多少子区间满足按位或和至少为 x

思路:类似 [Ynoi2014] 不归之人与望眼欲穿的人们 的做法,不过直接用线段树就是O(nloga+mlognloga)的,而且比较好写。

1|3CF997E Good Subsegments

题意:有一个1n排列P,如果区间[l,r]中的数是连续的,那么我们称它为好区间。有q次询问,每次问[l,r]内,有多少子区间是好的?

思路:一道线段树维护区间历史贡献加和的题。

考虑把原条件转化成求有多少区间满足 maxmin(rl)=0。然后考虑扫描线,然后用线段树维护区间最小值及最小值的历史出现次数。

具体的维护方法是设 sum 表示当前区间的最小值的历史出现次数,cnt 表示当前区间的最小值出现次数要对历史出现次数的贡献,然后下传标记时先下传加法标记然后下传对历史出现次数的贡献即可。

1|4CF1609F Interesting Sections

题意:求有多少子区间满足最大值的 popcount 等于最小值的 popcount

思路:有好多做法,写的是 tzc_wk 的扫描线做法。

考虑每次把 popcount 相同的位置当做关键位置,然后就相当于是有多少区间的最大值和最小值都是关键位置,于是记 fl 表示 [l,r] 的最大值是否是关键位置 + [l,r] 的最小值是否是关键位置,然后就相当于是求最大值及出现次数,修改就是区间修改,于是可以用线段树维护。


__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/18014464.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示