随笔分类 - 算法 - 倍增
摘要:怎么想都没想出来 $\log n$ 做法,那么这道题基本就是根号分治了. 题目描述中保证 $\sum k \leqslant 10^5$,然后 $k$ 在每次询问中又是相同的,那么就考虑对 $k$ 根号分治. 先对 $s$ 建立后缀自动机,然后把倍增数组求出来. 我们设块的大小为 $B$,那么当 $
        阅读全文
                
摘要:这道题有 3 个操作: 1. 换根 2. 求 LCA 3. 子树修改/子树求和. 对于第一个操作,直接换根就行. 对于第二个操作,分这几种情况讨论:$x,y$ 都在以 1 为根,$rt$ 的子树中,$x,y$ 其中 1 个在子树中,$x,y$ 都不在子树中. 对于都在子树中的情况,答案即为 $lca
        阅读全文
                
摘要:朴素的矩阵乘法时间复杂度会爆炸,但是我们发现矩阵乘法的形式是一个 $(1 \times n) \times (n \times n)$ 的形式. 所以如果提前预处理出来 $(n \times n)$ 矩阵的 $2^i$ 次幂,然后每次询问的时候二进制拆分,复杂度就是 $O(n^2 \log 1e9)
        阅读全文
                
摘要:code: #include <bits/stdc++.h> #define N 100004 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; ll S; ll val[N],d
        阅读全文
                
摘要:发现对于任意一条边,起决定性作用的是节点编号更大的点. 于是,对于每一条边,按照节点编号较大值作为边权,按照最小生成树的方式插入即可. 最后用线段树维护 dfs 序做一个区间查询即可. Code:
        阅读全文
                
摘要:现在看来这道题就非常好理解了. 可以将问题转化为求两点间经过 $k$ 个点的路径最小值,然后枚举剩余的那一个点即可.
        阅读全文
                
摘要:考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正解: 上面的大题思路是正确的,但是记忆化搜索太慢,考虑倍增 $floyd.$令 $f[i][j]$ 
        阅读全文
                
摘要:Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草。 这n块土地被n-1条边连接。 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=10000)。 这些边被安排成任意两头奶牛都
        阅读全文
                
摘要:题目描述:给定一个长串 $S$,给定若干 $S$ 的子串 $a_{i}$, $b_{i}$,再给出一些 $a$ 串和 $b$ 串的支配关系. 构造一个长度最长的字符串,使得:字符串只由 $a_{i}$ 组成.当且仅当 $a_{i}$ 所支配的一个串 $b_{i}$ 为 $a_{j}$ 的前缀,才可将
        阅读全文
                
摘要:题意: 给定一个串 $S$ 和若干个串 $T_{i}$每次询问 $S[pl..pr]$ 在 $Tl..Tr$ 中出现的最多次数,以及出现次数最多的那个串的编号. 数据范围: 需要离线 题解:首先,很常规的对 $T_{1}$ 到 $T_{rmax}$ 的所有字符串构建一个广义后缀自动机.来一遍线段树合
        阅读全文
                
摘要:code:
        阅读全文
                
摘要:在一棵树上,我们要求点 $(u,v)$ 之间路径的第$k$大数。 对于点 $i$ ,建立 $i$ 到根节点的一棵前缀主席树。 简单容斥后不难得出结果为$sumv[u]+sumv[v]−sumv[lca]−sumv[fa[lca]]$ 其他的和主席树是一样的。 Code:
        阅读全文
                
摘要:两点之间边权最大值的最小值一定在图的最小生成树中取到。 求出最小生成树,进行倍增即可。 Code:
        阅读全文
                
摘要:首先,我们一定要认识到本题中的最短时间所对应的道路不一定是在起点到终点的最短路。例如,起点到终点的最短路为 151515 ,那么对 151515 进行二进制拆分的话是 111111111111 ,这时求出的最短时间为4。然而如果有一条长度为 161616 的...
        阅读全文
                
摘要:Code:#include#include#includeusing namespace std;const int maxn = 200000 + 4;const int logn = 19;int F[30][maxn], dep[maxn];inlin...
        阅读全文
                
摘要:裸题,如此之水…Code:#include#includeusing namespace std;const int maxn = 100000 + 4;const int logn = 25;int f[logn][maxn], head[maxn dep...
        阅读全文
                
摘要:#include #include#include#includeusing namespace std;const int maxn = 50000 + 5;const int logn = 35;const...
        阅读全文
                

 浙公网安备 33010602011771号
浙公网安备 33010602011771号