8月18日训练笔记
来源:互联网 发布:大数据徐子沛在线阅读 编辑:程序博客网 时间:2024/06/05 06:32
今天一天的时间都花在了看题目上面,主要看了树状数组的有关题目,现在做一下总结:
常见的树状数组有三种模式:改点求段、改段求点、改段求段。其中第三种比较复杂,花了好长时间,但是没有看懂,所以先暂时做个模板来使用吧。还有最常用到的就是两点:
1.运用树状数组来求逆序数,即给你一串数字,让你求出每一个点或者所有点逆序数的和,注意,某一点的逆序数要充分利用sum函数可以用来表示比某个X小的数的个数这一特点,那么某一元素a[i]的逆序数即为:sum[n]-sum[a[i]];一定要注意这一点,还有就是要强调的是树状数组不能有0这个位置,做题目的时候一定要注意这个小细节,以及别忘了将树状数组初始化为0。具体的求逆序数的方法我已写在前面的博客中。
2.就是运用数组数组来进行数组的离散化,比如给定个数组 a[5] = {2, 5, 3, 4, 1},求b[i] = 位置 I 左边小于等于a[i]的数的个数.此例中b[5] = {0, 1, 1, 2, 0}。解决方案:直接遍历遍数组,每个位置先求出 getsum(a[i]),然后再修改树状数组update(a[i], 1)即可。当数的范围比较大时需要进行离散化,即先排个序,再重新编号。如 a[] = {10000000, 10, 2000, 20, 300},那么离散化后 a[] = {5, 1, 4, 2, 3}。这有效避免了数据过大导致超内存或范围的问题。这里要注意,在运用树状数组离散化的时候一定不要忘记对数组进行快排,用另外一个数组保存结果。其实还有一种更为简单的方法来对数组进行离散化,这是就要运用到我们前面STL中学到的lower_bound()函数了,函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,这个方法更为简洁简单。这两中方法我也写在前面的博客中了。
明天就是CCPC网络赛的选拔赛了,虽然知道到自己的能力,但是还是要试一试,记住一句话即可:能A一个题目就是成功,这也是锻炼自己的一个好机会,增加自己的实战经验,我相信会是一次宝贵的比赛经验的。
- 8月18日训练笔记
- 8月8日训练笔记
- 8月5日训练笔记
- 8月7日训练笔记
- 8月9日训练笔记
- 8月10日训练笔记
- 8月11日训练笔记
- 8月14日训练笔记
- 8月15日训练笔记
- 8月16日训练笔记
- 8月17日训练笔记
- 8月19日训练笔记
- 8月21日训练笔记
- 8月22日训练笔记
- 8月23日训练笔记
- 8月24日训练笔记
- 8月26日训练笔记
- 8月31日周四训练笔记
- 使用intent在活动之间穿梭——使用隐式Intent
- D
- bottle嵌入html,css,js
- 私有构造函数(某位大神的讲解)
- Git与github的使用
- 8月18日训练笔记
- map 迭代器的遍历
- springMVC详解(上)
- 质数
- 常用加密 以及解密方法(包含测试方法) DES Base64 AES
- 51Nod 1686(第K大区间)
- [编程题] 堆棋子
- 斐波那契数列
- 图的基本存储的基本方式一(邻接矩阵)