02 2024 档案
摘要:【问题分析】 分析题目可得此问题为01背包问题 因此题数据较小 所以可用枚举每一样物品选或不选的方法来写 【设计程序】 #include<bits/stdc++.h> #include<iostream> #include<stdio.h> #include<cstdio> #include<que
阅读全文
摘要:【问题分析】 分析题目可得此问题为连通块问题 因此题枚举被包围的‘0’较难 所以可用枚举每一个不被包围的‘0’ 【设计程序】 #include<bits/stdc++.h> #include<iostream> #include<stdio.h> #include<cstdio> #include<
阅读全文
摘要:【问题分析】 本题有n个数(n > 10^6)n很大, 查找m 个数(m≤10^5) ,数最大为(10^9) 方法一:用顺序查找的话时间复杂度为:O(n * m)会超时, 只能得部分分; 方法二:用桶排时间复杂度为O(n)+ O(m),但是因为数最大为(109)空间复杂度为:O(109); 方法三:
阅读全文
摘要:【题目分析】 本题有两个方法, 方法一:每一个位置可得的分分别求出,打擂找出最大(可得部分分) 方法二:从后往前求可得的分数,以避免一些不必要的重复。 【设计程序】 方法一: #include<bits/stdc++.h> #include<iostream> #include<stdio.h> #
阅读全文
摘要:【问题分析】 本题考了奇数。 由此想到以下定律: 奇数+偶数=奇数; 奇数+奇数=偶数; 偶数+偶数=偶数; 所以偶数可以忽略不计,只有奇数可以对结果产生影响, 所以我们只要注意奇数即可。 经过思考可得奇数的个数至少为 $k$ 个且比 $k$ 多的个数为偶数,此时多出的奇数可组成偶数,对结果不产生影
阅读全文
摘要:【问题分析】 方法一:排序后从小到大排查,因为同色的数必须要是此色中最小数的倍数,又因为小的数不可能是大的数的倍数,所以从小开始算,把后面它的倍数都标记掉。记颜色的数量。 方法二:因为数的最大小于等于 $100$ ,所以可以用桶排来写,把所有数分别装入相应的桶中后,从桶 $1$ 开始到桶 $100$
阅读全文
摘要:【问题分析】 本题中只能相加,所以大于2048的数都没用,这使得本题有用的数据最大为2048, 所以可用桶排也是理所当然啦!用桶把小于等于2048的数都装进桶中从桶1开始把可以相加的数都进上去,直到1024,因为1024是相加小于等于2048中的最大数。 【设计程序】 #include<bits/s
阅读全文
摘要:【问题分析】 因为要求和是奇数,所以可以想到想到以下定律: $1+0\equiv1(\bmod2)$ $1+1\equiv0(\bmod2)$ $0+0\equiv0(\bmod2)$ 所以不管什么数加上偶数,它的奇偶性都不会改变。 因此我们发现偶数只有凑数量的作用,只有奇数可以对结果的奇偶性产生影
阅读全文
摘要:【问题分析】 此题题目意思每次取左或右的零食。 按区间dp的惯例,要区间从小到大dp。 上代码。 【Code】 #include<bits/stdc++.h> using namespace std; const int N = 2000 + 5; int f[N][N], a[N]; //f[i]
阅读全文
摘要:有两种方法,代码注释都很详细了直接上代码 一:记忆化搜索 #include<bits/stdc++.h> using namespace std; int t[15]; int n, m; int a[400]; int mp[45][45][45][45];//mp[i][j][k][l]表示1号
阅读全文
摘要:本题每个位置有 $5$ 种可能,据题中 $n,m$ 均小于五,所以可以用搜索直接过。 上代码 #include<cstdio> using namespace std; bool mp[15][15]; int n, m, ans; int dt[4][5][2] = {{{-1, -1}, {0,
阅读全文
摘要:本题就是要找到最短的捷径。 注意事项: 捷径必须是直线。 要求捷径最短而非总路程最短。 捷径不与原有的路重合 既然在同一直线上,则该捷径的起点与终点的横坐标或纵坐标相等。要把横坐标或纵坐标相同的聚在一起只需要排个序即可。 捷径最短的话(以横坐标相等举例),只需要以 $x$ 为第一关键字,以 $y$
阅读全文
摘要:#include<cstring> #include<cstdio> using namespace std; char s[50]; int len; signed main() { int T; scanf ("%d", &T); while (T--) { scanf ("%s", s); l
阅读全文
摘要:首先,圈重点: $1\le n \le 500$ 所有元素在 $1\sim4$ 之间 任意连续的连续子串不相同 只要输出一种答案即可 于是我们可以得到的是: 由第一点和第二点可以看出此题可以写搜索解决。 由第三点我们可以得到一种剪枝方式,就是如果目前数字放入后会产生相同的连续的连续子串。 由第四点我
阅读全文
摘要:[](https://www.luogu.com.cn/user/366316) [](https://www.luogu.com.cn/user/191819)
阅读全文
摘要:未获得准确的时间。导致了迟到 /(ㄒoㄒ)/~~ 结果错过了前面的小半节课,也是让人难受 ≧ ﹏ ≦ 。 进入正题 T1 最优贸易简化版 解题方法: 分块 倍增 线段树 并查集 本次使用分块解决,其他方法见题目中的附件。 $n$ 个城市分布在一条直线上,从 $L$ 到 $R$ 获得最大利润时 $an
阅读全文
摘要:分块的思想就是将一大段数据分成若干个整段来达到快速维护和查询的效果。运用了懒标记的思想。 最简单的例子如题 一个简单的整数问题 #include <cstdio> #include <cmath> #define orz(i,a,b) for (int i = a;i <= b; i++) #def
阅读全文
摘要:树链剖分分为重链剖分和长链剖分 重链剖分 首先是重链剖分,树链剖分顾名思义是一种将代码大小增加1k树剖成一条条链的方法。 定义: 重儿子 该节点所有儿子中以该儿子为根的子树最大的儿子 重边 连接该节点与该节点的重儿子的那条边 重链 由根节点或一个轻儿子为链头一路重边连到叶子节点的链 总结一下就是将一
阅读全文
摘要:本题是非常非常非常纯粹的树剖,利用了重链剖分后下标的性质 不多说上代码就好了 #include <cstdio> #include <vector> #define ll long long using namespace std; const int N = 1e5 + 5; int n, m,
阅读全文
摘要:本题可以说是板题 P3384 的弱化版,只不过要改的变成了边权 边权很好处理,只需要将每个边的边权下放到两端点深度比较深的上面就好了(因为每个点连比它浅的节点必定只有一条边)。 那么就将模板改一下就好了 代码如下: #include <cstdio> using namespace std; con
阅读全文
摘要:首先分析一下题目,对于这棵树,操作如下: 查询从 X 到 Y 的路径上的前 k 大的值。 把 $P_i$ 上的武力值减去一个 $F_i$ 并在 Y 上的武力值加上一个 $F_i$,再把 $P_i$ 改成 Y。 将 $P_i$ 上的武力值减去一个 $F_i$ 再加上一个 Y,并把 $F_i$ 改成 Y
阅读全文
摘要:首先找最大公共子序列,可以轻松想到 $O(n^2)$ 的 dp 转移式子,$f_{i,j}=max\begin{cases}f_{i-1,j}&i>0\ f_{i,j-1}&j>0\ f_{i-1,j-1}+1&i>0,j>0,A_i=A_j \end{cases}$ 但是我们发现最后 $n\le1
阅读全文
摘要:先看题目,因为在文中可以发现,它有一个区间加区间减的操作,所以我们想到了线段树和差分,而下面题目是要我们自己查找让所有的数字相同的最小步数。 因此我们可以将线段树排除,那么来看差分,对于差分而言,所有的数字都相同,就可以看作对于所有的 $2\le i \le n$ 而言,$a_i = 0$,最后的结
阅读全文
摘要:这是一道非常经典的题目。 首先可以想到暴力的算法,一一匹配取最小值,期望时间复杂度为 $O(n^2)$,很明显过不了此题。 所以我们考虑分治,我们每次将所有点按 x 分为两半,然后分治两半,取最小值,然后就可以获取到左右两块内部最小值,那么大范围内的最小值只有左边最小值,右边最小值或者横跨左右的最小
阅读全文
摘要:看题目可以发现每个点的需求需要看它儿子所需要的值,所以就可以理所当然的想到将所有的点的儿子节点加在一起,然后排序,让大的先处理,所以我们就得到了一分美好的代码。 #include <cstdio> #include <vector> #include <queue> using namespace
阅读全文
摘要:首先讲讲 st 表。这个东西呢,就是一种利用了倍增思想的预处理数据从而达到快速查询的功能。 for (int i = 1;i <= n; ++ i) scanf ("%d", &f[i][0]); for (int i = 1;i < 21; ++ i) { int t1 = 1 << i - 1,
阅读全文
摘要:这个题目,可以看出每一个盘里的水往下流出的路径会是一样的,而且没有修改操作,所以我们可以预处理出每个盘里往下的路径,已经要下去所需要的水。 那么首先需要寻找每个盘往下的第一个盘是那个。对于盘 i 来说,第一个盘 j 应满足 $j>i &&D_j>D_i$,所以就可以想到用单调栈处理每个盘下第一盘。
阅读全文
摘要:前置芝士——二叉搜索树 BST 简介 二叉搜索树是一种二叉树的树形数据结构,其定义如下: 空树是二叉搜索树。 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。 二叉搜索树的左右子树均为二叉搜索树
阅读全文
摘要:本人写 blog 纯属无聊瞎整,主要写给自己看,不喜勿喷。 (๑•̀ㅂ•́)و✧
阅读全文