ACM训练周中总结—10月12日

来源:互联网 发布:淘宝挖掘冷门暴利行业 编辑:程序博客网 时间:2024/06/12 00:24

        过去的这个半周主要是在做题,做到了几道我觉得有启发的题,下面就回忆一下吧。

        首先是树状数组H题 

HDU 4267 A Simple Problem With Integers

,就是给了一串数,两种操作,1是找给位上数的值,2是给l到r上,且(i - l) %k ==0(l<=i<=r)(k<=10)的数加c。在听取了大神的指导后才有了思路,这道题相当于区间更新上加了一个限定条件,由于k的值比较小,可以对每一个k都建立树状数组,同时为了确定给那个位置加数,还要加l%维护模k的余数,这样建立维护a[x][k][l%k],再利用树状数组针对l到r加一下就可以了。

       还顺便水了道逆序数的题C题,给一串数,Q求顺序数对的总个数,R更新将l到r区间中,l位上的放最后,l+1到r的数依次向前推。其实就是输入的时候用一下树状数组求出正序数对的总个数,剩下的区间更新由于更新区间不超过1000位所以暴力操作就可以了。

       线段树的题:16题,Buy Ticket,给n种操作,向区间里面插数(放进第几位的后面),思路很简单,因为最后进去的一定就在那个位置,所以连线操作倒着来,线段树更新给区间有多少空位,尽量向左放。

       另外,小明系列问题—小明序列也印象深刻,就是求最长上升子序列,但又序列之间元素位置的限制d,元素之间间隔d。因为每个位置上的数的值只出现一次,这道题用线段树记录该数值所在的位置为结尾的数可以形成的最长上升子序列(维护区间最大值),依次进行更新,只对dp[i]更新到dp[i-d-1]的位置就可以了,每次查找0到a[i],上最大值+1,因为对线段树只更新i-d-1的位置,所以此时就是间隔d位的最长上升子序列。