ACM-10月15日周日周末训练心得

来源:互联网 发布:健身行业数据 编辑:程序博客网 时间:2024/06/05 03:59
    又到了一周的周末,这周开始活动不是那么多了,也稳定下来了,花了更多的时间去学习,我们小组约了好几次去acm室一块做题目讨论,这些时间完完全全的投进在ACM的感觉还不赖,今天几乎就是一天坐在电脑前看题目了,今天做梳妆数组的时候看了关于树状数组单点更新并且能删除元素的处理,对于HDU3874这道题,要做一个预处理需要一个树状数组A[n],从左到右读入所有的a[i],如果当前a[i]=x值是第一次出现,就执行add(i,x),否则不执行。当扫描完了n个值后,保证sum(R)就是区间[1,R]的答案。然后对所有查询的区间进行排序,使得[L,R]区间中L小的区间排在前面。我们首先用sum(R)给出所有区间[1,R]的查询。接着计算所有区间[2,R]的查询,但是做这步前,还需要消除a[1]对后面序列的影响,使得我们这个序列就好像是本来就是从a[1]开始的,从来没有存在过a[1]。这就是离线话处理,要完成这个要求,只需要执行add(1,-a[1])并且需要找到a[1]值第二次出现的位置y执行add(y,a[1])。做完上面这步,就保证了当前的sum(R)就是区间[2,R]的答案(有关区间[3,R],[4,R]等的查询。
     所以每当查询完了区间[i-1,R]的答案后就要找到a[i-1]的值出现的下一个位置y(如果不存在为-1时,就默认为n+1位置),执行add(i-1,-a[i-1]) 和 add(y,a[i-1])即可。可以用next[i]=j来表示与a[i]值相同的下一个值出现在j位置。用hash[h]=i表示值为h的a[i]第一次出现的位置是i。
原创粉丝点击