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

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

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

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

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

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

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

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

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

1.$ans_1=\sum\limits_{l=1}^{n}\sum\limits_{r=l}^{n}(a_l xor a_r)*max(a_i|l\leqslant i \leqslant r)$
2.$ans_2=\sum\limits_{l=1}^{n}\sum\limits_{r=1}^{n}[(a_1 xor a_r) > max(a_i|1\leqslant i \leqslant r)]*max(a_i|l\leqslant 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值