码迷,mamicode.com
首页 > 其他好文 > 详细

[题解+总结]20151017数据结构

时间:2015-10-19 00:22:38      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

1、前言

  表示今天学的东西还是挺多的,数据结构一直以来内容就多。第四题比以前做过的一道题还水一些,结果没有写出来。

 

2、R R的烦恼

大概题意:给出一个长度为n的数列,共t个操作,每次可以将一段区间增加x,也可以寻找数列中最左端和最右端的k,输出距离。

总结:考试的时候并没有写出来,只能想到线段树,但是显然维护起来是要死的。开始只听说过分块,但是并没有去试过,可能也是因为用的不是很多。这道题的话用分块是很好做的,时限是3s,是可以过的。

题解:分块。由于我们需要寻找最左端的某个值和最右端的某个值,线段树若要维护某个值的位置,太麻烦了。首先我们想一下暴力的写法。区间修改,直接for循环;寻找k,从左和从右进行两次for循环。如何加快速度?我们考虑将这个数列均匀的分成若干块,对每一块进行处理。

  类似于线段树,我们在某些情况下,为了降低复杂度,会给一些目前暂时不需要进行修改或询问操作的区间先做一个标记,表示这一段将要加上某个数。假设当前给[l,r]增加x,可能横跨多个块,对于中间的块直接上标记;对于左右侧没有全覆盖的块,直接进行暴力加减。

  询问的过程看起来似乎复杂度就比较高了,其实不然。我们每次对某个块进行修改之后,可以将其从小到大(反之亦然)进行排序,那么在每个块中询问某个数的时候,可以直接二分答案。

  这一切貌似并不是很高端的东西,但是它的最低复杂度远低于暴力枚举。为何称之为最低?注意到,分块的大小我们并没有定义。而从上述描述中也可以看出来,块的大小似乎并不影响程序的正确性,故我们只需要找到一个最合适的大小,使复杂度最低。一般情况下,大小选取√n,也可以自己去定。平均复杂度为O(t * (√n log(√n)),3s是可以过的。

 

3、Card 神秘卡片

略。

 

4、Captain 分队

大概题意:给出n个点,每个点存在两个值a[i],b[i]。共t次询问,每次询问给定两个数,要求找出包括这两个数的一个数集合,满足:集合中a值最高者i,b[i]与其他数的b的绝对值相差小于等于k。

题解:

[题解+总结]20151017数据结构

标签:

原文地址:http://www.cnblogs.com/jinkun113/p/4890629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!