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一个题目就是成功,这也是锻炼自己的一个好机会,增加自己的实战经验,我相信会是一次宝贵的比赛经验的。

原创粉丝点击