随笔分类 - 数据结构
摘要:惨。今天聪哥选了2013 多校10做训练,结果一题都没做出来。这个题目是数据结构,正好是我强项如果只是插入 删除 光标左右移动,那都小菜,用链表全解决,关键是那个Q k 要求 a1到aq的连续子序列和最大(子序列一定要以a1开头)。然后我用记录每个节点的当前最大和总体最大,这样只要知道第k个是哪个数...
阅读全文
摘要:这个题目要求和 还有 设置区间值 区间增值,明显要用线段树来由于行数不超过20 而列数多达 10^5,所以对每一行建一棵线段树。然后主要是在懒惰标记方面是难点 针对两种操作 分别设置 set 和 add 方法,但是优先级方面要好好考虑可能出现的结果无非是 单独的 set 或者 add 以及 先set...
阅读全文
摘要:已知有 x[0-(n-1)],但是不知道具体的值,题目给定的信息 只有 I P V,说明 Xp=V,或者 I P Q V,说明 Xp ^ Xq=v,然后要求回答每个询问,询问的是 某任意的序列值Xp1^Xp2,,,,X^pk这个题目用加权并查集是这么处理的:1. f[]照样是代表父节点,照样进行路径...
阅读全文
摘要:给出K*K的矩阵,每一行取一个数,构成K个数的和,总共有 k^k种可能,从中取出前k个最小的。一开始犯了错,因为只要对每行排序,最小的必定是第一列的和,然后我当时就想着,逐步推进,每次将某行的那个数变成其下一列那个数,当然间距要最小。我这样明显是不对的,这样的话每个数只用了一次,而题目的意思明显是可...
阅读全文
摘要:上次的湘潭赛的C题,用线段树敲了下还是WA,不知道为何,我已经注意了处理相同数据,然后他们当时用的RMQ。所以学了下RMQ,感觉算法思想是一样的,RMQ用了DP或者是递推,由单个数到2^k往上推,虽然有部分重叠的,也没关系,因为RMQ是求区间最值嘛然后这道题目,要把出现次数化为最值,构造一个新的数组...
阅读全文
摘要:上周比赛的题目,由于那个B题被神编译器的优化功能给卡了,就没动过这个题,其实就是个字典树嘛。当然,由于要在Boggle矩阵里得到初始序列,我还一度有点虚,不知道是用BFS还是DFS,最后发现DFS要好一些,但是会不会超时呢,我就先敲了DFS部分,先在DFS里面输出所有情况,发现总共搜完只有24W+的...
阅读全文
摘要:本来这个题目就是个合并区间的题,就跟Hotel一样,要插入一段,则找左孩子 合并后的中间区间 右孩子,但是比较恶心的是,他需要实时得到某一段的起终点,或者某个点在第几个段里面,我想过在线段树里面加入几个变量来记录左右边界,发现还是不行,因为还要可以消除某个区间段后来找博客发现向量原来还可以动态的插入...
阅读全文
摘要:好印象深刻的题,前天选拔赛给跪了。怪我这种关键题没敲出来。题意很简单,给你一串无规则的数列,再给个m值,求出满足 数列和>=m的长度最小的连续子串。。。确实一开始卡住了,因为看数据肯定是nlogn的算法才能过,我和聪哥坐在外面的楼梯上,想了各种方法,我就一直在想前缀和以及 先求出最长连续和 再两边删...
阅读全文
摘要:2014 csu校赛 I 题,比赛的时候拿着他看了几个小时愣是没弄出好的方法,我们也想过统计出每个root的节点总数,然后减去离它d层的子节点的数目,即为答案。但是因为树的存储是无序的,所以每次为了找到子节点还是需要搜索,这肯定是承受不了的。事实上,这个思路大体是对的,只是需要进行预处理,使得在找离...
阅读全文
摘要:这个题目要求在一个大矩阵里面匹配一个小矩阵,是AC自动机的灵活应用思路是逐行按普通AC自动机匹配,用过counts[i][j]记录一下T字符矩阵以i行j列为开头的与P等大的矩阵区域 有多少行已经匹配了,显然如果该数值==p的行数,则说明匹配成功就是在自动机的过程中,匹配得时候要稍微多想一下,每次匹配...
阅读全文
摘要:首先我们应该是枚举 L个位置上的每个字符来得到最终概率然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得#include #include #include #include #include using namespace std;const int max_...
阅读全文
摘要:因为字符集比较大,所以就不能用简单字典树,在字典树里面,用链表进行存储。这个倒是不难,练了下手统计的时候还是有点难搞,因为要算所有的两两比较的次数之和,对分叉处进行计算,注意细节#include #include #include using namespace std;const int N = ...
阅读全文
摘要:第二道AC自动机的题目了,之前参考的是网上一个博客算法,不怎么好,难写而且占空间后来参照大白书做的这题,代码简洁多了#include #include #include #include #include #include #define N 12000using namespace std;map mc; //防止模板里出现重复的struct AutoTrie{ int ch[N][28]; int val[N]; int f[N]; int cnt[N]; int last[N]; int sz; void init() { m...
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5235这种题目居然没想到,一开始往矩阵快速幂想去了,因为之前跪了太多矩阵快速幂,后来就。。哎,擦。怎么没想到就是个线段树呢因为1 A[x] * A[x-1] 这个是很容易推出的,比赛的时候看到这个就想那个快速幂去了,根本没往线段树上想,其实用线段树存储前面的矩阵,得到一个询问 1 0 A[x-2]L R,则访问 L+2 ,R的矩阵部分提取出来,再跟A[L] A[L+1]相乘就是结果了则建树为 nlogn,访问为mlogn,由于n和m都在10^5,所以可以承受...
阅读全文
摘要:http://acm.whu.edu.cn/land/problem/detail?problem_id=1542今天做武大的网赛题,哎,还是不够努力啊,只搞出三个这个题目一看就是个最短路,但是题目数据量太大,n^2承受不起,而且如果只是个最短路,那题目花这么大力气叙述有些城市可以互相免费干嘛呢这个是聪哥发现的神奇的细节,题目里说It is guaranteed that there are no more 200 coalitions.暂且把这个称作空域,也就是说最终免费的城市都成了一个块,而不同的块只有不超过200个,聪哥当时是这么分析的,如果真是这样的话,那可以先用并查集把这200个块求
阅读全文
摘要:求火柴的组成的数字最多能组成多少种数字,典型的递推问题但是因为结果巨大,要用高精度运算一开始手写高精度,不仅挫的要死,最后还WA了。最后学了一下白书上面的bign类,相当方便啊。#include #include #include #include #include #define N 720using namespace std;struct bign{ int len,s[N]; bign() { memset(s,0,sizeof s); len=1; } bign(int num) {*this=num;} string ...
阅读全文
摘要:因为最近学了Splay,刚看到这个题目总共四种操作,把某个数移到另一个数的左边 或者右边 交换两个数 翻转整个序列,马上想到用Splay,因为总点数和总操作数都为10^5,如果用Splay把操作优化到logN级别,应该是可以再1sec过得。于是我就好心急的在那里敲Splay,敲着敲着就发现不对劲了,题目要求的把x移到y的左边或者右边 或者交换x和y的值,不是指序列的第x位和y位,而是就直接指数值为x和y的那两个数。所以Splay根本就不适用所以还是回到链表来,其实用链表也挺简单的,一开始我还想复杂了,每个x和y就固定对应自己的节点x,y,进行4个操作的时候,前三个,只要把节点x和节点y连起来或
阅读全文
摘要:必须要批评下自己了,首先就是这个题目的迟疑不定,去年做字典树的时候就碰到这个题目了,当时没什么好的想法,就暂时搁置了,其实想法应该有很多,只是居然没想到。同样都是对单词进行建树,并插入可能值,但是拨号键盘上的字母是对应多个的,给定拨号序列,有多种可能情况 输出其中最可能的一种,肯定要想到搜索啊,而且拨号数目不超过100,每个按键最多只对应4个字母,复杂度并不高,所以用dfs是可行的,对于每次递归深度,dfs找到最大的可能值的情况并输出。接下来就是要批评自己了,下午一点钟开始做这个题目,居然被一个小bug搞了一个多小时,都没过样例,就是我的dfs写挫了,而且我迟迟没找到原因。。。真的要反省自己的
阅读全文
摘要:其实主要是想学一下字典树的写法,但这个题目又涉及到了DP;这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到。其实就是通过递推,从1扫到最后一位,由d[i]代表1-i位的时候的组合总数,则对d[i]进行扩张,凡是可以从第i+1位到第j位正好对应一个单词,则,d[j]+=d[i];这样递推完,d[len]即为最后结果为了表示某个单词的结尾,在字典树中再加一个变量 flag,当单词结尾的时候为1,否则为0,这样只要在树种读到了flag=1的时候,即表示读到这个单词。#include #include #inc
阅读全文
摘要:题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次看下数据10的五次方,10的五次方的硬循环是避免不了了,很明显在计算被淹次数的时候要能缩到logN的复杂度才好。于是想到先对桥由低到高排一下序,然后获取前一次的落水值和这次的涨水值,只要桥高度在涨落直接的必定是又被淹了一次。要多次对序列的某个区间进行加操作,自然是线段树了,确定区间的时候,就用二分,在进行线段树的时候 用懒惰标记#include #include #include #include #define Lson (rt=
阅读全文

浙公网安备 33010602011771号