您的位置:首页 > 其它

ACM训练周末总结—10月15日

2017-10-15 21:23 190 查看
        这半个周主要还是在做树状数组与线段树专题,下面就整理一下吧。

        主要是是线段树:

        1,Mayor's posters这道题题目大意就是有一个一维的墙,依次向上面的区间贴海报(l,r),先贴上去的的可能会被后面的遮挡住,求整面墙上可以看见几个候选人的海报。其实这就类似一个染色题,只要把贴海报的顺序倒着贴,如果该区间已经有海报了就不更新。另外这道题因为这座墙太宽,所以在建立线段树之前还要离散化区间。剩下的就是线段树染色操作,用flag记录本次染色是否染过空白区间,有就将ans+1.

       2,Frequent values首先这道题一定要看清题意,给一串非减的数,因为非减所以一样的数一定是连在一起的,然后区间查询找出(l,r)中出现次数最多的数的出现次数。其实这道题后来想了一想觉得区间合并好像也能做。而我用了其他方法。因为给出的序列相同数相连。所以我设计了一个结构体node{  int x; int l; int r;int v;} 是(l,r)区间是x这个数,里面有v个数。这样将数列离散化几个这样的结构体元素。然后按新元素的建立线段树。输入区间[l,r],利用二分法找出l与r分别在哪两个元素管的区间内。然后线段树找出l到r之间区间所被管辖元素最大的值。当然要注意细节比如l与r在一个元素之内的情况。

      3,Man Down这个游戏就是在几个高度上有若干区间,不同区间上有不同的权值,有正有负,找出从区间上跳下到地面可以得到的最大值。其实就是dp+线段树。将区间按高度从小到大排序,dp[i]表示以第i个区间为结束可以获得的最大权值。用线段树进行染色操作,每次找出[l,r],中l与r,所被染的颜色(高度一定比现在低),然后取dp[l]与dp[r]大的。更新本dp[i]。就可以了。

       4,Atlantis这就是一道典型的扫描线题,注意要离散化,利用X[],将浮点数离散成整数点,二分法确定位置。这道题就是标准线段树。

      5,Tunnel Warfare这是我刚发现的水题,就是最简单的区间合并,建立三棵线段树分别表示该区间做连续长,右连续长,最长连续长度。举基础线段树。

      6,Who Gets the Most Candies?题意:N个人围成一圈第一个人跳出圈后会告诉你下一个谁跳出来跳出来的人(如果他手上拿的数为正数,从他左边数A个,反之,从他右边数A个) 跳出来的人所得到的糖果数量和他跳出的顺序有关 所得的糖果数为 (假设他是第k个跳出的)
则他得到的糖数为k能被多少个数正数 比如说 k = 6 ;6 = 1*2*3*6 所以他得到的糖数为4;这个题就是用线段树记录区间空位数。然后以此都是常规操作。

     这次先整理这些吧,其实还做了树状数组的题,放到下一篇吧。

      

         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: