标签:
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。
题解:
标签:
原文地址:http://www.cnblogs.com/jinkun113/p/4890629.html