什么什么的

来源:互联网 发布:手机照相翻译软件 编辑:程序博客网 时间:2024/04/18 10:01
    天马行空有时候更有效。
    为何这么说呢?因为很多时候我们是思维跟着算法和数据结构走。想着自己学过什么,然后怎么把问题转化到相关问题上。这固然是一种正确的思维方式,把未知变已知。但鉴于我们这弱菜对于算法结构之类所知实在有限,用这种思维不免处处碰壁。。。
    其实我想说的是,抛开算法和数据结构的话,对于一道题,我们总该有些自己的想法。。。
    以 Sereja and Ballons 为例。
    大意:给定从左到右编好号的N个盒子,每个盒子原先有Ai个球。给定M个区间[Li,Ri]。Q次取球,每次取出某个盒子的一个球。询问每次取球后有多少个区间的盒子全部为空。(n<=10^5,Ai<=10^5)
    做该题前听大牛说这题要用函数式线段树(又称主席树),但是函数式线段树到底是啥玩意儿自己根本没搞清楚。只是用它来求过区间第k大值而已。这题怎么用呢?苦思冥想而不可得。后来厚着脸皮百度了一下,找到了某位大牛精辟简洁的解题报告:询问即统计S(Ri)-S(Li-1)==0的数量,开始每个盒子都是独立的块,如果一个盒子i已空,就将i所在的块与i-1所在的块合并(因为值相同),新增的答案即为Li-1i-1所在的块且Rii所在的块的询问,发现是一个二维偏序的统计,利用主席树预处理即可单次O(logN)询问.
   直看得我等弱菜膜拜不已。前面几句让我豁然开朗,可是后面两句。。。首先弱菜不知道什么是二维偏序统计,然后不知道怎么解决这种统计问题;然后又不知道怎么用主席树。。。苦想半日,发现我这弱菜果然还是弱菜。。。后来觉得吧,Ai那么大,有些根本就不会被取空啊(当然不排除所有Ai都很小很小的情况。。。)。所以总的来说,空盒子还是比较少的,所以直接找空盒子不就得了?看看新增的空盒子在哪些区间内。这点也是受大牛的前几句启发。
   L[i] 表示 第i个盒子左边第一个不为空的盒子编号,R[i]为第i个盒子右边第一个不为空的盒子编号。考虑
当前取的球所在的盒子 x,如果这是最后一个球,那么满足 L[x] <= Li<= x <= Ri < R[x] 的区间都是新增的空区间。这样,先把所有区间按左端点排序,二分查找枚举新增区间就行了。意想不到的是不仅A了,而且时空效率都很可观。若果出现那种恶心的数据,即空盒子很多,很可能就T了。
    再就是,今天的遗憾。
    2013_hdu_多校第九场_1006_Front Compression
    大意:给定长度不大于10w的字符串S,然后给定不超过10w个编好号的区间[Li,Ri].求编号相邻的区间的最长公共前缀。
    学过后缀数组的话这题几乎套个模板就轻松A掉。奈何弱菜虽然看过一点后缀数组,但是对其精髓完全没有掌握。眼看这题A掉了100多人,我的队友果断决定打暴力。奈何游戏打得太多暴力打了好久,并且还有bug。万幸之后被纠正但是有遇TLE难题,果断放弃。
    本人在花了4个小时稀里糊涂搞完本该两小时前就被A掉的1001后,开始想1006怎么解决冗余。暴力的话,对于随机数据,公共前缀不会太长,即使达到了几十已经非常了得,因此很有可能过。不随机的数据,不难想到最简单的就是连续字符相同的情况,比如aaaaaa...aaaaa;更恶心的是子串重复:abababab....ababab。。。对于前者,处理起来很简单。Define L[i] = max{ j| s[i]==s[i+1]==s[i+2]== ... == s[i+j-1]};这样比较的时候可以实现跳跃式前进。眼看代码就要完成,结果 Time over...回来之后完善了一下,提交之后居然也A了!而且无论是时空效率还是代码长度都是最佳!
    着重一点是,这对一个排名一直下降,状态一直低迷的队伍来说是一个不小的打击。怎么比赛时就那么沙茶,浪费了那么多时间呢?咳~~还是太菜啊。。。
    Ps. D(n) = sigma{ ai*bi | 0<=i<=n-1 } 这种东西怎么会有D(0)捏?坑死人不偿命是吧?   
0 0
原创粉丝点击