「总结」区间/序列题型总结

孔乙几显出极高兴的样子,将一个鼠标敲着电脑桌,点头说,“对呀对呀,序列题有四百样出法,你知道么?”

最近序列题考得有点频繁,于是出来总结一下。

(不过部分区间题目我已经忘了啊QAQ,只能拣一些稍微简单的写。还是我太蒻了啊QAQ)

学数数(出处:NOIP模拟测试29(B) B题

题目大意:n个数组成一个序列,记录n*(n+1)/2个序列中的最大值构成一个新的序列,在这个序列中进行三种操作:1.查询比k大的值的个数 2.查询比k小的值的个数 3.查询等于k的个数

正解:单调栈扫,统计每一个数作为区间最大值的区间数,然后开桶维护前缀和查询。

english(出处:NOIP模拟测试31 C题

题目大意:对于整体区间计算两个答案:

1.$ans_1=sumlimits_{l=1}^{n}sumlimits_{r=l}^{n}(a_l xor a_r)*max(a_i|lleqslant i leqslant r)$
2.$ans_2=sumlimits_{l=1}^{n}sumlimits_{r=1}^{n}[(a_1 xor a_r) > max(a_i|1leqslant i leqslant r)]*max(a_i|lleqslant i leqslant r)$

正解:单调栈预处理出对于每一个$a_i$左侧第一个大于它的数字的位置$l_i$和右侧第一个大于它的数字的位置$r_i$。

对于$ans_1$,维护每一位二进制下1的个数的前缀和,对于每一个i,查询左侧0的个数和右侧1的个数相乘再左移相应的位数,然后查询左侧1的个数和右侧0的个数相乘再左移相应的位数,相加累加答案。

对于$ans_2$,解法一(我没打):维护一个可持久化01trie,记录好过每一个点的数字个数,对于每个点所控制的区间进行查询。解法二(向lockey大神学习):莫队优化01trie的建立和删除过程。

计划(出处:NOIP模拟测试35 B题

斯诺(出处:NOIP模拟测试38 B题

原文地址:https://www.cnblogs.com/xingmi-weiyouni/p/11479719.html