12 2018 档案
摘要:定义——来自百度百科 子串 一个字符串中连续的一段成为这个字符串的子串。 后缀 后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串 r 的从 第 i 个字符开始的后缀表示为 Suffix(i) ,也就是Suffix(i)=r[i,len(r)] 。 子串的大小 大小比较:关于字符串的
阅读全文
摘要:题目链接 思路 先求出后缀数组,并且求出LCP。二分一下长度len。check的时候就是看有没有连续的k个后缀的LCP大于len。也就是判断是不是有连续的k 1个height大于len。 代码 cpp include include using namespace std; typedef long
阅读全文
摘要:题目链接 思路 首先肯定想到贪心,从队尾和队首取更小的那个。 但是如果遇到队尾和队首一样大的情况呢,总不能再挨个往前比较。所以就把整个字符串倒过来再挂到现在字符串的后面,也就是把当前字符串对称过去。然后求出后缀数组,给每个后缀都求个排名。然后每次取得时候取排名更小的就行了。 注意这个题的输出格式,每
阅读全文
摘要:基础 暴力!! 啥叫莫队 莫队是前国家队队长莫涛想出的算法。用于处理一些可离线的区间问题。可以将本来是$n^2$的复杂度优化成n 根号级别。是基于分块的。 普通莫队 这类莫队用来处理一类可离线,无修改的区间问题,也是最基础的莫队。 先来看这样一道题: 给出一个长度为n的序列,然后有m次询问,每次询问
阅读全文
摘要:题目链接 题意 一天做到两道这种题目描述如此神仙的题也是够了。真锻炼语文能力。 题目的意思其实就是,给你一个序列,然后每次询问一个区间。使得尽量按照严格上升的顺序从这个区间内取数。如果当前取得数字小于等于前面的其中一个,就让rp ,然后重新开始记录。问rp最多可以是多少。 思路 思考一下可以发现,其
阅读全文
摘要:题目链接 题意 读完题目就一个感受:这出题人tm不会说人话吗。真的感觉这个题理解题意比想出正解更难。 其实题目的意思就是,给出一些单词,给这些单词编个号,然后要求其他的单词中是这个单词后缀的词都在这个词的前面。每个单词的贡献是当前单词的标号减去他的后缀中标号最大的那个的标号。 希望我能表达明白吧23
阅读全文
摘要:题目链接 思路 这道题我用的是AC自动机的做法。 先把子串挂到trie树上,在单词结尾打标记的时候,标记的是当前单词的长度。然后去上面查询母串的时候,每查询到一个单词,就建立一条线段,这条线段的结尾位置是母串当前的位置,开始位置就是用当前位置减去这个单词的长度。 然后只要去判断,选出一些线段,使得这
阅读全文
摘要:用途 AC自动机适用于一类用多个子串在模板串中匹配的字符串问题。 也就是说先给出一个模板串,然后给出一些子串。要求有多少个子串在这个模板串中出现过。 KMP与trie树 其实AC自动机就是KMP与trie的结合版。或者说是在trie上进行的kmp算法。所以学会kmp和trie是学习AC自动机的基础。
阅读全文
摘要:昨天考试分层图最短路用个dp暴力水了90分。今天只有10分。。。还是好好来学分层图吧。~~(实际是不想学数据结构2333)~~ 一类问题 分层图最短路得经典模板题就是这样 给出一个n个点m条边的无向图,每条边有边权,可以选择最多k条边,把他们的边权变为0。问从S到T的最短路是多少。 解法 一般这类问
阅读全文
摘要:题目链接 思路 对于每一种颜色都建立一个动态开点线段树。然后每次查询的时候就去这个颜色的线段树上查询就行了。修改之后不要忘记交换颜色。 这个题目数据有点强。抄了个比较快的读入优化才卡过去。 代码 cpp / @Author: wxyww @Date: 2018 12 13 08:59:51 @Las
阅读全文
摘要:机房同传了新的系统,不使用dev的话每次开机都要重新更改环境变量(其实也可以在编译命令里添加绝对路径)。所以就去学习了一下用bat脚本更改path。以便每次开机可以一键更改添加环境变量 其中前面是一些语法,PATH可以更改成其他的变量。后面抄上就行了。$\%path\%$是引用原来的path,然后加
阅读全文
摘要:可持久化线段树 可持久化线段树就是支持历史版本的查询和修改的线段树。主席树就是可持久化线段树的一种 思想 如果正常情况下我们想要保留每个历史版本的话。那么假如有n次操作,就要搞n棵线段树。 但是我们发现,第i棵与第i 1棵线段树的大部分节点都是相同的,那么可不可以共用这些节点,从而减小时空复杂度呢。
阅读全文
摘要:题目链接 思路 查询区间第k小,考虑主席树。因为是从u到v的简单路径上,考虑将路径分为从u到lca和从lca到v两部分。所以对于每个点都维护出从根节点到当前节点中的点。查询的时候只要用ans[u] + ans[v] ans[lca] ans[fa[lca]]就行了。也就是在主席树的查询代码上略加修改
阅读全文
摘要:题目链接 思路 观察这个$(r l + 1)/2$,很容易证明,如果一个数出现次数大于$(r l + 1) / 2$,那么这个区间内第$(r l + 1) / 2 + 1$大一定是这个数。所以只要用主席树查询出区间内第$(r l + 1) / 2 + 1$大,然后再去查这个数在这个区间内出现次数,就
阅读全文
摘要:题目链接 思路 裸的主席树。查询的时候,通过相减求出区间内左子树中数的个数a。然后判断要查找的k是否比这个z要大。如果比这个值大,那么就去右子树中查找第k z大,否则去左子树中查找第k大。 代码 cpp / @Author: wxyww @Date: 2018 12 11 16:27:19 @Las
阅读全文
摘要:题目链接 思路 听说可以CDQ分治,然后我不会,所以我写树套树 首先肯定先按照a拍个序。然后就成了在b,c这两个数组中查询了。用一个树状数组套treap来维护。当插入一个数的时候,就在树状数组的b这个位置的treap里加入一个c。然后查询的时候就直接把小于等于c的数的个数进行前缀和就行了。 注意题目
阅读全文
摘要:思想 树套树像他的名字一样,就是一棵树套另一棵树。用一棵外层树来维护一些区间之类的东西。然后外层树的每个节点都是一棵内层树。就这样 一道模板题 bzoj3196 思路 这是一道线段树套平衡树的模板题。外层用一棵线段树来维护区间操作。然后线段树的每个节点都是一棵平衡树 操作1:查询从l到r中比k小的数
阅读全文
摘要:题目链接 吐槽 这道题调了7个小时也是够了。最后只好比着题解做了一遍2333 思路 首先考虑n=2000的情况。因为这是在一条路径上,所以可以考虑差分。用a[i][j]表示第i个点中j这种粮食出现的次数。加入要在从x到y的路径上加入c这种粮食。将这条路径分为两部分进行差分。从x到lca,也就是将a[
阅读全文
摘要:前置知识 权值线段树&动态开点线段树 适用范围 有时候我们需要对权值线段树进行合并操作。然后就用到了线段树合并。一般是有很多棵线段树,然后需要将其中的两棵合并起来。 方法 其实方法很简单呢。就是分三种情况讨论一下。假设现在要将线段树a和线段树b合并。并且a成为合并之后的线段树。 如果a有当前子树,而
阅读全文
摘要:题目链接 题目大意 有一个矩阵,总共有4种操作 0:清空这个矩阵 1 x y c:将$(x,y)(1 \leq x ,y\leq 10^6)$这个点加上一种颜色c$(0\leq c \leq 50)$(注意是加上,也就是之前的颜色不会被覆盖) 2 x y1 y2:查询左上角为$(1,y1)$,右下角
阅读全文
摘要:权值线段树 所谓权值线段树,就是指线段树内存的是权值。~~好像是废话~~。给出一些数,要查询一个区间内的数的个数。这时可以用权值线段树,开个n(n为给出的数的最大值)个点的线段树。然后就能轻松的维护了~~当然树状数组更简单~~ 动态开点 为什么要动态开点呢?当然是因为空间不够啊。比如还是上面那个例子
阅读全文
摘要:题目链接 思路 数学题 首先列出等差数列求和的式子。 $$S = \frac{(n + m)(n m + 1)}{2}(n为末项,m为首项)$$ $$S 2= (n + m)(n m + 1)$$ 若想让m更小,那么肯定要让等差数列中数字的数目更多。也就是让$(n m + 1)$更大,而$(n m
阅读全文
摘要:题目链接 思路 set+map+优先队列就可以水过去。可以发现,每插入一个元素,都会使得操作2中原来相邻的那个差值消失,然后多了两个新的差值。对于新的差值,只要直接扔到优先队列里就好了。那么删除呢。可以用map记录一下当前元素被删除了多少次。然后查询的时候将被删除的跳过即可。对于操作3,只要将插入的
阅读全文
摘要:题目链接 思路 splay区间操作的裸题。 假如要对l r这段区间操作,那么就先把l 1伸展到根节点,然后把r +1伸展为根的儿子。这样r + 1的左儿子就是要操作的区间了。只要在上面打上标记,以后每次查询的时候pushdown一下。 然后对于l 1和r+1节点可能不存在,所以可以放两个标兵元素。就
阅读全文
摘要:胡扯 因为先学习的treap,而splay与treap中有许多共性,所以会有很多地方不会讲的很细致。关于treap和平衡树可以参考这篇博客 关于splay splay,又叫伸展树,是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Ta
阅读全文
摘要:题目链接 思路 可以先考虑一棵树 如图,如果是一棵树我们肯定会想这样子做,但是现在根没有入度。所以现在需要再加入一条边使他变成基环树。 假如现在加入一条边$3 2$,那就会出现一个3 1 2 3的环。然后以这个环上的点为根,就可以找到很多棵满足条件的树 可以发现,这样就解决了根没有入度的问题。 结论
阅读全文
摘要:题目链接 思路 因为这些数字是从小到大加进去的,所以以当前数字结尾的最长上升子序列可以从前面位置的任何一个数字转移过来。所以只要能知道每个数字最终位于哪个位置就行了。 没想到出了treap还有什么办法求出来这个序列。看了眼题解发现用vector的insert直接模拟就能过。~~(纳尼?)~~这个函数
阅读全文
摘要:题目链接 思路 首先可以证明当这个高度是中位数的时候耗费时间是最少了。所以可以$n^2log(n)$用一个treap预处理出每个区间的中位数。 然后就是知道了中位数怎么计算答案的问题。 然后发现暴力n m的扫能过~~而且跑的还不慢~~ 但是~~作为一个正直善良的OIER~~我还是用$n^2log(n
阅读全文
摘要:题目链接 思路 这个题其实就是对于treap中的删除操作进行一些修改。自己yy了一种做法。就是在删除的时候,如果要删除的数比这棵子树的根大,那么就把根变成根的右孩子,这样就相当于删除了整棵左子树和根节点。然后重新维护一下siz,并且维护一下平衡性就行了。 竟然把rotate函数写错了。调了30min
阅读全文
摘要:题目链接 思路 比较裸的一道平衡树的题。用一个变量S来表示当前树的情况,当S为负数时树内为宠物,当S为正数时树内为人。然后每次分情况讨论一下。如果树为空或者是与来的东西(人或宠物)与树内存的相同。那么就无法领养,直接将这个东西扔到树里。否则就从树里面找一个与当前值最接近的数字,然后统计进答案。 一开
阅读全文