ACM训练日记—8月23日

来源:互联网 发布:知乎校园招聘 编辑:程序博客网 时间:2024/05/21 14:06

         早上的时候刚得知树状数组的专题联系早就已经开了,我这才开始去做。树状数组这个专题对我来说果然是有难度的,目前今天做出来的题都是些水题。

         第1001题,说的是有那么一个二维的网格,上面有书,四种对书的操作,增,删,移动,求和。这道题我其实之前看过类似的二维树状数组的博客,思路都一样,二维的树状数组行与行之间,列与列之间都是和一维一样的lowbit关系。

         还做了一道dp+树状数组的题,就是求一个数组的上升子序列的总数按照动态规划就是设dp[i]是以i为结尾的上升序列总数,那么dp[ i ]=sum(dp[ j ]), j < i 且 a[ j ]< a[ i ]。这其实也是水题,很明显按常规做法是大约n^2,而如果用树状数组记录以a[ i ]数为结尾的上升序列总数,依次处理加和就算出来了,当然还一定要记得进行离散化处理。

        第17题是我看过博客的一道题,感觉印象深刻,可就是记不清了,推导了半天才想到了点头绪,是二分+树状数组,讲的是一队牛,编好了号(没重复的号,从1,,,到,,n),后来打乱了顺序,给出每头牛前面有多少牛编号比它小,求现在的顺序。这道题上来完全可以通过给出的数组末尾的数求出最后一头牛的编号,然后就可以从后向前依次推导,这时我们假设i位置上的数是x,用树状数组标记右面有什么数出现从而很容易求getsum()任意数前面有多少比它小的数出现过,那么x-1-getsum(x)=a[i](给出前面有多少比x小的数)而对于x,就存在一个单调关系,因getsum(x)一定程度随x变化不比x大,那么x越大x-1-getsum(x)就越大,二分查找出x点就可以了。

       果然对之前的博客消化一直不彻底,17题一直感觉印象深刻,看过,可就是做的有些费劲。。。

原创粉丝点击