Big String 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 如果直接模拟的话,移动到后面的数据量太大.我们分块的话,就可以优化,减少移动的量.  很典型的块状数组.块状数组的next指向的是一块,而不是一个.这里用整数代替了指针. 每一个块就是一个对象.这题用面向对象编程. #include <iostream> #include <cstdio> #inclu…
Big String Time Limit: 1000MS Memory Limit: 131072K Description You are given a string and supposed to do some string manipulations. Input The first line of the input contains the initial string. You can assume that it is non-empty and its length doe…
题意:给一个字符串(<=1000000)和n个操作(<2000),每个操作可以在某个位置插入一个字符,或者查询该位置的字符.问查询结果. 思路:块状数组. 如果将原来的字符串都存在一起,每次插入肯定会超时. 而操作数比较少,考虑使用分块法.假设原字符串长度为L,则取每块长度l=sqrt(L).这样每次插入,我们需要用sqrt(L)的时间找到对应的块,再用sqrt(L)在该块进行插入.查询同样需要sqrt(L)找到该块,如果用数组实现可以O(1)找到目标元素.(我尝试用stl链表来做,结果超时了…
有了上一题的经验(POJ的静态区间第K最值)再解决这道题就轻松多了 空间5256KB,时间3330ms,如果把动态开点的平衡树换成数组模拟的话应该会更快 之所以选择了平方分割而不是树套树,不仅是所谓趁热打铁,更是因为: 平方分割的修改操作,无论编程复杂度还是时间复杂度都远优于树套树. 代码如下:(鄙人不才,不会压代码,所以写了300多行Σ( ° △ °|||) template <class T> struct SbtNode { typedef SbtNode<T> Node;…
干掉这道题的那一刻,我只想说:我终于**的AC了!!! 最终内存1344K,耗时10282ms,比起归并树.划分树以及其他各种黑科技,这个成绩并不算光彩⊙﹏⊙ 但至少,从最初的无数次TLE到最终的AC,这过程见证了一个二分算法的艰辛优化 感谢国家,感谢XXTV,感谢<挑战程序设计竞赛>~( ̄▽ ̄)~* 先贴代码: ; ; ; ; const int maxV=1e9; int bucket[bktCount][bktSize]; int unOrdered[bktSize*bktCount];…
K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 59798   Accepted: 20879 Case Time Limit: 2000MS Description You are working for Macrohard company in data structures department. After failing your previous task about key inse…
hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个区间范围内了(假设为[l,r]),那么我们算下这个区间内的lcp的最小值(设最小值的位置为mid,大小为x),如果x*(r-l+1)>=k,那么,答案就是这个区间的lcp的最小值的某一部分(具体是哪一部分,画个图稍微算下就出来了).如果x * ( r - l + 1 ) < k 那么我们分两种情况…
codefroce D. Powerful array[初识块状数组] 由于是初始所以,仅仅能先用别人的分析.囧... 题目: 给定一个数列:A1, A2,--,An,定义Ks为区间(l,r)中s出现的次数. t个查询,每一个查询l,r,对区间内全部a[i],求sigma(K^2*a[i]) 离线+分块 将n个数分成sqrt(n)块. 对全部询问进行排序,排序标准: 1. Q[i].left /block_size < Q[j].left / block_size (块号优先排序) 2. 假设1…
此乃一道笔试题,当时的确也做出来啦.(但是在细节上还是出错啦,对多次重复出现的数字可能会重复计数,没有记录上次删除的元素) 如题,有序数组,可以知道平方之后在两边的数据较大,中间的数据较小. 因此可以使用两个下标,从两边向中间扫描.将绝对值大的数字删掉,计数即可,并记录刚才删除的数值的绝对值,以免出现多次相同的数据,重复计数的问题. 具体看完整代码: #include <iostream> #include <vector> #include <algorithm> u…
题意:任意区间求第k大数 思路: 预处理:利用平方分割(分桶法)把区间切割成B = sqrt(n)大小的一块块,然后每个各自排序. 二分第k大数x,接着就需要求[l,r]区间中x的排名,与k比较,将两边端点非完整桶的点进行扫描,最多B次,其余每个桶进行二分查找排名,可利用upper_bound(STL)即可快速实现. 评价: 二分确实坑爹,不过搞了这一题也算对二分查找理解深入了些. 二分正确做法: 对于[0..n-1)有[0..m]满足性质其余不满足, 则应用[l, r)进行二分查找, 最后l一…