方差

令 DDD 为方差,SSS 为区间和,S2S_2S2​ 为区间平方和。

D=1r−l+1∑i=1r(ai−Sr−l+1)2=1r−l+1∑i=1r(ai2−2Sair−l+1+S2(r−l+1)2)=1r−l+1(S2−S2)\begin{aligned} D &=\frac{1}{r-l+1} \sum_{i=1}^{r}\left(a_{i}-\frac{S}{r-l+1}\right)^{2} \\ &=\frac{1}{r-l+1} \sum_{i=1}^{r}\left(a_{i}^{2}-\frac{2 S a_{i}}{r-l+1}+\frac{S^{2}}{(r-l+1)^{2}}\right) \\ &=\frac{1}{r-l+1}\left(S_{2}-S^{2}\right) \end{aligned} D​=r−l+11​i=1∑r​(ai​−r−l+1S​)2=r−l+11​i=1∑r​(ai2​−r−l+12Sai​​+(r−l+1)2S2​)=r−l+11​(S2​−S2)​

对区间平方和进行区间加

S2′=∑i=lr(ai+v)2=∑i=lr(ai2+2vai+v2)=S2+2vS+(r−l+1)v2\begin{aligned} S_{2}^{\prime} &=\sum_{i=l}^{r}\left(a_{i}+v\right)^{2} \\ &=\sum_{i=l}^{r}\left(a_{i}^{2}+2 v a_{i}+v^{2}\right) \\ &=S_{2}+2 v S+(r-l+1) v^{2} \end{aligned} S2′​​=i=l∑r​(ai​+v)2=i=l∑r​(ai2​+2vai​+v2)=S2​+2vS+(r−l+1)v2​

等差序列

对于 l∼rl \sim rl∼r 加上一个等差序列,令首项为 aaa,公差为 DDD。可以发现等差序列公式和差分有点像,所以先进行差分,那么区间修改相当于在 lll 加上 aaa,在 (l,r](l,r](l,r] 加上 DDD,在 r+1r+1r+1 加上 −a−D×(r−l)-a-D \times (r - l)−a−D×(r−l) 即可。那么查询操作是区间求和。

最长单调序列 逆序对

以最长不下降序列为例,维护一个权值线段树或树状数组,区间 [l,r][l,r][l,r] 为 ai∈[l,r]a_i \in [l,r]ai​∈[l,r] 的最长不下降子序列。正序扫,对每个数对桶进行区间最大值转移,再把这个数加进去更新。

逆序对同理,倒着扫,只不过区间最大值改成区间求和。

最大子段和

维护一个线段树,对于一个点表示的 [l,r][l,r][l,r],有三类。一是左儿子的答案,二是右儿子的答案,三是左儿子的后缀与右儿子的前缀拼接。那么线段树要维护的是前缀,后缀还有区间和即可。

对于查询函数,如果当前区间被查询区间包括,返回当前区间答案。如果查询区间全部在当前节点的左儿子或右儿子内,直接递归左儿子或右儿子。否则是当前区间包括了查询区间,那么递归下去把左儿子和右儿子中的询问区间找出来,再讨论一下三类取最值。

P2824 排序

给定一个排列和若干个修改,每次修改将一段区间升序或降序排序。最后求 ppp 上的数字。

这真女少口阿。

用线段树来排序是不可能的,但可以用区间求和与区间修改模拟 01 序列的排序。而且只有最后的一次查询,那么 ppp 上的数字有没有单调性?先二分这个要查询的数试一试,让大于等于这个二分值的数为 111,小于的为 000,那么对每个询问对 01 序列的排序,如果最后位置 ppp 是 111 那么就减小二分值,为 000 则增大二分值,这当然有单调性了,就做完了,带了两个 log⁡\loglog。

P1712 区间

在一个数轴上有 nnn 个闭区间,选出 mmm 个区间使得它们包含至少同一个位置。求所有合法方案的最小区间长度极差。

哎,排序区间的长度好像没什么影响,那先排序。排序后好像可以尺取法,那么就一直选,选到有 ≥m\ge m≥m 个公共点时就停下来,再减少长度小的区间,直到减少了这个区间就 <m<m<m 个公共点再停下来。那么选择的区间就是答案。

至于有多少个公共点,区间加求最大值即可。

P2633 Count on a tree

求一条树上给定的若干个路径上的第 kkk 小点权。

主席树 + 树链剖分

考虑一条链上的问题,每棵主席树都是一个的前缀中每个点权出现次数的桶,那么用前缀和的思想可以求出 [l,r][l,r][l,r] 每个数中出现的次数,再线段树二分一下即可。那么放到树上,可以将前缀和变成树上前缀和,用 lca 转一下就行。

HDU 6315 Naive Operations

给定一个排列 bbb,你需要维护一个初始全 000 的序列 aaa,支持 如下两种操作

  • 区间加 111
  • 查询区间 ⌊aibi⌋\left\lfloor \frac{a_{i}}{b_{i}} \right\rfloor⌊bi​ai​​⌋ 之和

直接求不方便,不然把给 ai+1a_i + 1ai​+1 换成给 bi−1b_i - 1bi​−1,如果减到了000就加一 ,再把把 bib_ibi​ 赋值回来。可以维护一个区间最小值和区间和,最小值如果减成了 000 就暴力递归到叶子修改,因为 bbb 是排列,所以这个暴力的复杂度是调和级数不会超时。

二维数点

给定平面上 nnn 个点 (xi,yi),\left(x_{i}, y_{i}\right),(xi​,yi​), 每次问你一个矩形内有多少点。 1≤n≤1051 \leq n \leq 10^{5}1≤n≤105 允许离线。

用二维前缀和拆成四部分去维护,这是一个二维偏序问题,先对第一维排序,用线段树或树状数组去维护即可。

蚯蚓

给你一堆数,有 nnn 个,并对他们操作 mmm 次。每次取出最大的一个数 xxx,称之为母数。并将 xxx 分割成左端数 [x×p][x \times p][x×p] 和右端数 x−[p×x]x-[p \times x]x−[p×x],并把这两个数放回数堆中,其余数均增加 qqq 。ppp 固定为 (0,1)(0,1)(0,1) 的有理数。要求输出每次操作的数x和m次操作后所有数的和。

对于 85%85\%85% 的数据,是可以用优先队列搞的。我们用优先队列维护所有蚯蚓的长度,每次取出长度最长的蚯蚓,将其切成两半并丢回队列。有一个问题是如何让其他蚯蚓的长度增加 qqq 呢?可以记录蚯蚓整体增加的长度,对被切成两半的蚯蚓,将其长度 −q-q−q 即可。

对于 100%100\%100% 的数据,数据范围不允许带 logloglog,但是找规律可以发现一个隐藏的单调性先切成两半的蚯蚓的一半,一定比后切成两半的蚯蚓对应的一半长。所以可以用三个队列分别维护没有被切的蚯蚓,被切成 [x×p][x \times p][x×p] 的蚯蚓,和被切成 x−[p×x]x- [p \times x]x−[p×x] 的蚯蚓,每次选出三个队列中最大的蚯蚓切一下再丢回对应队列中即可。

永恒的契约

食物链

动物王国中有三类动物 A,B,CA,B,CA,B,C,AAA 吃 BBB, BBB 吃 CCC,CCC 吃 AAA。现有 NNN 个动物,以 1∼N1 \sim N1∼N 编号。每个动物都是 A,B,CA,B,CA,B,C 中的一种,但是我们并不知道它到底是哪一种。

一个人按顺序说了 KKK 句话,第一种说法是 1 X Y,表示 XXX 和 YYY 是同类。第二种说法是 2 X Y,表示 XXX 吃 YYY。但这 KKK 句话真假不明,当一句话满足下列任一条件,这句话就是假话,否则就是真话。

  1. 当前的话与前面的某些真的话冲突,就是假话;
  2. 当前的话中 XXX 或 YYY 比 NNN 大,或当前的话表示 XXX 吃 XXX,就是假话。

求假话的总数。

并查集能维护连通性、传递性。比如朋友的朋友是朋友,朋友的敌人是敌人。但是,维护敌人的敌人是朋友就很难维护了,所以就有种类并查集的诞生。这道题有三个物种,于是我们给并查集开三倍的空间。对于每种生物,第一倍空间储存同类,第二倍储存猎物,第三倍储存天敌,我们不能确定每种生物是 AAA 还是 BBB 还是 CCC,知道生物的相对关系就够了。

讨论第一种话,XXX 与 YYY 是同类,可以转换成 XXX 不吃 YYY 且 YYY 不吃 XXX。如果有一点不满足,那么就是谎言。如果都满足,那么 XXX 的同类都是 YYY 的同类,XXX 的天敌都是 YYY 的天敌,XXX 的猎物都是 YYY 的猎物。再讨论第二种话,XXX 吃 YYY,可以转换成 XXX 与 YYY 不是同类且 YYY 不吃 XXX。如果有一点不满足,那么就是谎言。如果都满足,那么 XXX 的同类是 YYY 的天敌,XXX 的天敌是 YYY 的猎物,XXX 的猎物是 YYY 的同类。

Kinoman

有一个长度为 nnn 的序列 f,fi∈1∼mf,f_i \in 1 \sim mf,fi​∈1∼m,有一个长度为 mmm 的价值序列 www 。选择一个区间 [l,r][l,r][l,r] 获得的价值是
∑i=lrwfi×[count(fi)=1]\sum_{i=l}^r w_{f_i} \times [count(f_i)=1] i=l∑r​wfi​​×[count(fi​)=1]
问价值最大的区间的价值。

预处理出每个数在序列 fff 中第一次的位置,和 fif_ifi​ 在 fff 中下一个出现的位置 nxtnxtnxt。用线段树维护每个位置作为右端点的答案。首先预处理出以 111 为左端点的答案。当 l+1l + 1l+1 时,[l,nxti−1][l, nxt_i - 1][l,nxti​−1] 间答案 −wfl-w_{f_l}−wfl​​。而 [nxti,nxtnxti−1][nxt_i, nxt_{nxt_i} - 1][nxti​,nxtnxti​​−1] 间答案 +wfi+w_{f_i}+wfi​​。如果 nxtnxtnxt 不存在,可以看作是 n+1n + 1n+1。然后每次更新最大值。

练习题

给定一棵 NNN 个节点的树, 每个点 iii 有权值 aia_iai​。有 QQQ 个询问, 对于询问 x,y,kx,y,kx,y,k , 分别输出树上从 xxx 到 yyy 的路径中, 权值小于 / 等于 / 大于 kkk 的点的数目。强制在线。

这是对树的查询,我们可以通过求 lcalcalca 转换成对一条链的查询。套路地,对于一个点 xxx,我们维护一个权值线段树以维护一个桶 bbb,对于每一个在根到 xxx 路径上的点 yyy,令 bay++b_{a_y}++bay​​++。当然,我们不能对每一个点重新建立一棵线段树。这个线段树要支持单点修改和区间求和,区间求和求的是前缀和。我们可以先 dfs 一遍原来的树,在 dfs 的过程中建立主席树。

Mex

有一个长度为 nnn 的数组 a1∼na_{1 \sim n}a1∼n​。mmm 次询问,每次询问一个区间内最小没有出现过的自然数。即求区间 mex。强制在线。

考虑建立权值线段树,维护每一个权值在原数组中最后一次出现的下标。对于查询操作 [l,r][l,r][l,r] ,可以取出右端点所对应的主席树,并在树上二分查找下标小于 lll 的最小权值即为答案。虽然 aia_iai​ 非常大,显然答案不会超过 nnn,所以不用离散化。

20ZR暑期集训 简单数据结构相关推荐

  1. 暑期集训5:并查集 线段树 练习题A:  HDU - 1232 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题A  --   HDU - 1232 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅 ...

  2. 暑期集训3:几何基础 练习题D:  HDU - 2036 ​​​​​​​

    2018学校暑期集训第三天--几何基础 练习题D  --    HDU - 2036 改革春风吹满地 " 改革春风吹满地,  不会AC没关系;  实在不行回老家,  还有一亩三分地.  谢谢 ...

  3. 题解报告(CDUT暑期集训——第三场)

    题解报告(CDUT暑期集训--第三场) A - Problem A. Ascending Rating HDU - 6319 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口 ...

  4. 第一次暑期集训之前期排位赛

    今天结束了一个星期以来第五场个人新生排位赛,暑期集训的第一阶段就这么结束了,对于这一星期以来所能有的最大的体会就是心酸,从未有过的心酸,面对那一道道题目时百思不得其的无助与苦恼,难的不会,简单的也不太 ...

  5. 暑期集训5:并查集 线段树 练习题G: HDU - 1754

    2018学校暑期集训第五天--并查集 线段树 练习题G  --   HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让 ...

  6. 暑期集训5:并查集 线段树 练习题F:  HDU - 1166 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题F  --   HDU - 1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A ...

  7. 暑期集训5:并查集 线段树 练习题B: HDU - 1213 ​​​​​​​

    2018学校暑期集训第五天--并查集 线段树 练习题B  --   HDU - 1213 How Many Tables Today is Ignatius' birthday. He invites ...

  8. 暑期集训4:栈,树,优先队列 例 :  UVA - 514 ​​​​​​​​​​​​​​

    2018学校暑期集训第四天--栈,树,优先队列 例题  --   UVA - 514 Rails There is a famous railway station in PopPush City. ...

  9. 暑期集训3:几何基础 练习题H: POJ - 2456

    2018学校暑期集训第三天--几何基础 练习题H  --   POJ - 2456 Aggressive cows Farmer John has built a new long barn, wit ...

最新文章

  1. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
  2. 从线上教育的如火如荼,反思传统培训行业的未来发展
  3. INPUT type=password 元素 | input type=password 对象
  4. Hibernate学习笔记
  5. Yii AR Model 查询
  6. 肺癌图片识别的相关信息
  7. python2读取excel中文处理,【Python】【源码】利用Python读取Excel文件-续
  8. [视频]Google Chrome背后的故事
  9. 使用webpack打包ThinkPHP的资源文件
  10. 【DS】atoi()实现
  11. 使用OData快速构建REST服务
  12. python训练神经网络模型_bp神经网络python 训练
  13. mac下解决无法往U盘内复制文件的问题
  14. 2017年苹果开发者账号申请——注册苹果账号
  15. K8S (kubernetes)
  16. Linux CFS中的进程调度
  17. Jackson解析与生成Json字符串
  18. 金算盘与金蝶的“全程电子商务“谁第一?
  19. 【SC应用】【人工智能】Java实现猴子摘香蕉,动画显示
  20. 步进电机驱动器一体机VSMD122_025T(北京伟恩斯技术有限公司)使用方法

热门文章

  1. 免费在线PDF工具,支持全平台!强烈建议收藏!
  2. 随机截距交叉滞后模型(Random Intercepts Cross-Lagged Panel Model, RI-CLPM)
  3. scipy.misc包中的toimage和fromimage
  4. 扬帆开局|香港电讯与国家(深圳·前海)新型互联网交换中心合作项目正式启动
  5. java开发工具包 jdk_什么是JDK? Java开发工具包简介
  6. C++描述 LeetCode 485. 最大连续1的个数
  7. 详解广播域和冲突域的区别
  8. 习题5-4 使用函数求素数和 (20 分)答案
  9. python如何输入一个数_Python 数据的输入
  10. css文字超出省略号代替不起作用解决方法汇总大全