01 2019 档案
摘要:给你m个字符串,让你构造一个字符串,包含所有的m个子串,问有多少种构造方法。如果答案不超过42,则按字典序输出所有可行解。 由于m很小,所以可以考虑状压。 首先对全部m个子串构造出AC自动机,每个节点有一个附加属性val[u]代表结点u包含的子串集合。 设dp[l][S][u]为长度为l,包含子串集
阅读全文
摘要:给你一个n*m的矩阵,和一个x*y的模式矩阵,求模式矩阵在原矩阵中的出现次数。 看上去是kmp在二维情况下的版本,但单纯的kmp已经无法做到了,所以考虑字符串哈希。 类比一维情况下的哈希算法,利用容斥可以得到二维情况下的哈希算法,同样可以做到O(1)的查询。总复杂度O(n*m+x*y)。 蓝书上给的
阅读全文
摘要:给定一个图,支持三种操作: 1.删除一条边 2.查询与x结点相连的第k大的结点 3.修改x结点的权值 解法:离线倒序操作,平衡树or线段树维护连通块中的所有结点信息,加个合并操作就行了。 感觉线段树要好写很多。 平衡树(Treap)版: 1 #include<bits/stdc++.h> 2 typ
阅读全文
摘要:题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉。 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺恶心的东西,而且时间复杂度是O(nlog3n),比主席树还多了个logn。 最高效的方法是用一个叫整
阅读全文
摘要:题目链接 FWT的板子题,思想不是很好理解,但代码还是非常好写的。
阅读全文
摘要:题目链接 题意:有n架飞机,每架飞机有两个着陆时间点可以选,要求任意两架飞机的着陆时间之差不超过k,求k的最大值。 解法:由于每架飞机都有两个选择,并且必选且只能选其中一个,时间冲突也是发生在两架飞机之间的,因此二分答案,对冲突的时间建边处理,然后跑2SAT即可。
阅读全文
摘要:题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u。 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可。 感觉自己的建图写得好丑啊,一直在纠结用数组还是结构体~~
阅读全文
摘要:题目链接 平衡树基础题,用于测试各种平衡树的性能(雾) treap: 1 #include<bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 struct Treap { 5 static const int N=1e5+
阅读全文
摘要:题目链接 题意:你的任务是根据m条指令改变排列{!,2,3,...,n}。每条指令(a,b)表示取出第a~b个元素,翻转后添加到排列的尾部。输出最终序列。 解法:splay对区间分裂合并翻转,模板题。 初学splay,代码写得有点挫,以后慢慢改~~
阅读全文
摘要:题目链接 题目大意:一共有Q(1<=Q<=50000)组操作,操作分为两种: 1.在x,y,z处添加一颗星星 2.询问以(x1,y1,z1)与(x2,y2,z2)为左上和右下顶点的矩形之间的星星数 所有坐标取值范围均为[1,1e9] 思路:由于坐标取值范围太大(即使离散化后也很大),3维的数组肯定开
阅读全文
摘要:题目链接 题意:求有向图从s点到t点的第k短路,每个点可以重复经过。 解法:建一个正向图和一个反向图,先用Dijkstra求出反向图中从t点到其他点的最短距离dis,再用A*算法求出第k短路。 A*求第k短路的方法:与Dijkstra算法类似,设结点nd(u,g)表示当前所在点为u且从s到u经过的长
阅读全文