test617 - test714 解题记录集锦
test617
b
使用 kmp自动机,再动态规划即可
乘积筛
暴力枚举时间复杂度
记忆化
时间复杂度
国战
对每个点到根节点的
对于一个点
具体使用 可持久化线段树
对于每个询问只需知道
使用 二分 查询
时间复杂度
test703
最小基因序列
简单贪心,考虑后缀字典序最大,使用 vector ,遍历一次刷掉一些,注意如果位数不够后要从后面继续遍历,玄学时间复杂度
等差数列
明显是个环,分类讨论,另外一种情况是要看补集。
然后先找到公差
策略游戏
发现差不会变,我们记表示
二元组的第二个元素状态数只有的因数级别。
状态不会超过1344个,直接转移即可。
简单记忆化搜索。
int dfs(int a, int b) {
if(a == 1) return 0;
if(f[a][b] != 0) return f[a][b];
int ans = a - 1;
//if(b == 1) return a - 1;
int now = b;
for(int i = 2; i * i <= b; i++) {
if(now % i == 0) {
int d = i;
ans = min(ans, dfs(a / d, b / d) + 1 + a - a / d * d);
ans = min(ans, dfs(Ceil(a, d), b / d) + 1 + Ceil(a, d) * d - a);
while(now % i == 0) now /= i;
}
}
if(now != 1) {
int d = now;
ans = min(ans, dfs(a / d, b / d) + 1 + a - a / d * d);
ans = min(ans, dfs(Ceil(a, d), b / d) + 1 + Ceil(a, d) * d - a);
}
// cout << endl;
return f[a][b] = ans;
}
test 707
异或平方和
需要拆开处理,对于
那如何变成平方呢?
想下竖式乘法的过程,需要对每一位分别乘上下一个数的每一位,换言之,当
现在有四个变量
只需要记
时间复杂度
除雪
将一个点拆成
记
贪心即可,没什么好说的。
天堂之战
结论题,得出结论后使用倍增维护
记录
删边操作不好计算,不如离线改成加边操作。
排列
易得
test712
生命游戏
求时间最大,很明显二分时间
对于时间
若一个点到离它最近的一个"."的距离 > t ,那么称这个点为初始点
求出初始点可以用 BFS 实现
最后对所以得初始点模拟
Bajka
定义状态
对于一个
memset(b, 0, sizeof(b));
for(int j = 1; j <= n; j++) {
int x = s[j] - 'a' + 1;
if(b[x]) f[j][i] = min(f[j][i], f[b[x]][i] + abs(b[x] - j));
b[x] = j;
}
memset(b, 0, sizeof(b));
for(int j = n; j >= 1; j--) {
int x = s[j] - 'a' + 1;
if(b[x]) f[j][i] = min(f[j][i], f[b[x]][i] + abs(b[x] - j));
b[x] = j;
}
序列修改
假如要修改
对于下一个与
为保证
test714
valk
建两棵字典树后,进行 DFS
记
selotejp
轮廓线 DP
papricice
50pts
使用 DFS 序,枚举两个点并判断是否为祖孙关系,分类讨论
100pts
只枚举一个点,另一个点最优使用 set 维护,判断是否为祖先关系可以使用一个栈