02 2024 档案

摘要:原题链接 题解:拓扑排序+动态规划 我们首先根据给定的先修课程关系,构建出一个有向无环图。已知每个结点的时间都是time[i-1]+其入度结点的最大值。最后比较出最大的出度为零的结点的时间 code class Solution { public: static const int N=5e4+5; 阅读全文
posted @ 2024-02-27 21:18 黑屿白 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 首先这题是一个有向无环图,如图,每个结点上方显示的是到达该节点的路径数,我们不难发现每个结点的路径数都由其入度结点的路径数之和,最终得出5结点的路径数。那么由此我们只需要求出每个无出度结点的路径数再相加即可。 code #include<bits/stdc++.h> using na 阅读全文
posted @ 2024-02-27 19:16 黑屿白 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解:逆序思维 我们如果正着考虑戳印序列,那么题目会很复杂,但是如果我们倒着考虑,即最后按下的戳印位置一定和stamp一一对应,然后将该位置改为?后再取匹配,那么问题就容易解决了。 class Solution { public: int n,m; int sum[1005],que[10 阅读全文
posted @ 2024-02-27 16:16 黑屿白 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 拓扑排序+dp。 首先以入度为零的结点为起始结点,其游览城市数量为1,接下来每到下一结点,游览城市数++;即当前结点的游览城市数是上一结点的游览数+1,并取最大值。 code #include<bits/stdc++.h> using namespace std; const int 阅读全文
posted @ 2024-02-24 20:08 黑屿白 阅读(19) 评论(0) 推荐(0) 编辑
摘要:原题链接 在拓扑排序的基础上加上了一个条件:尽可能按字典序排序,这就使得题目难度加大。 题解:拓扑排序+小根堆 拓扑排序是采用队列一个一个出队列来删除对应结点的边,那么我们只需要保证每次出队列的结点都尽可能小,就能保证字典序。 每次出队列的值都为队列中的最小值,刚好可以采用小根堆来实现。 code 阅读全文
posted @ 2024-02-23 21:11 黑屿白 阅读(20) 评论(0) 推荐(0) 编辑
摘要:原题链接 拓扑排序模板。 code #include<bits/stdc++.h> using namespace std; const int N=1e4+5; int head[105],Next[N],to[N],que[105],sum[105]; void build(int i,int 阅读全文
posted @ 2024-02-23 18:25 黑屿白 阅读(19) 评论(0) 推荐(0) 编辑
摘要:原题链接 这道题运用了 逆序思维 的方法。具体看题解区。 code class Solution { public: int n,m,sum=0; void dfs(vector<vector<int>>& grid,int i,int j){ if (i<0 || i>=n || j<0 || j 阅读全文
posted @ 2024-02-23 16:03 黑屿白 阅读(3) 评论(0) 推荐(0) 编辑
摘要:原题链接 扩展欧几里得算法的应用,关于原理性的讲解这里就略去了,这边给出学习链接即模板。 int exgcd(int a,int b,int &x,int &y){ if (b==0){ x=1; y=0; return x; } int d=exgcd(b,a%b,x,y); x=y; y=d-a 阅读全文
posted @ 2024-02-22 21:32 黑屿白 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原题链接 我们先根据题意构建图G。然后我们可以得出如果一个普通结点A连接着两个感染源结点,那么其无论如何都会被感染;因此我们要找寻那些只与一个感染源结点相连接的普通节点; 然后我们在图中把感染源结点擦除,可以得到几个只由普通结点构成的图,我们把这几张图看作一个集合(即使用并查集);接着我们遍历每个集 阅读全文
posted @ 2024-02-18 16:06 黑屿白 阅读(19) 评论(0) 推荐(0) 编辑
摘要:原题链接 根据题意我们可以得到一个很有趣的结论:处于同一行或者同一列的石头是共处一个集合的,而一个集合最终可以消除到只剩一个石头。(可以实验一下) 因此我们采取并查集实现。 Code class Solution { public: int sum=0; int father[1005]; map< 阅读全文
posted @ 2024-02-14 15:19 黑屿白 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原题链接 并查集模板练手。 递归版本 #include<bits/stdc++.h> using namespace std; const int N=1e4+5; int father[N]; int find(int mid){ if (father[mid]!=mid){ father[mid 阅读全文
posted @ 2024-02-13 19:38 黑屿白 阅读(13) 评论(0) 推荐(0) 编辑
摘要:原题链接 首先根据题意可以列出暴力解法,时间复杂度为O(n^2),很明显会超时。 接下来讲解双指针解法: 设两指针i , j ,指向的水槽板高度分别为h[i] , h[j] 。由于可容纳水的高度由两板中的 短板 决定,因此可得面积公式S=min(h[i],h[j])*(j-i). 在每个状态下,无论 阅读全文
posted @ 2024-02-12 15:35 黑屿白 阅读(11) 评论(0) 推荐(0) 编辑
摘要:原题链接 解法一:二分搜素 首先我们知晓A-B=C,那么A=B+C,我们只需要遍历数组中的每一个元素然后在数组中搜素a[i]+c的值是否存在即可。 Code #include<bits/stdc++.h> using namespace std; typedef long long ll; cons 阅读全文
posted @ 2024-02-10 18:47 黑屿白 阅读(14) 评论(0) 推荐(0) 编辑
摘要:原题链接 作为二分答案的入门题非常合适。 很典型的二分答案。但是这题有一个坑点,left的值不能设为0这种确定的值,而是应该设为这个数组的最大值。 这道题警示了我二分答案的一个重要前提:确定合理的二分区间。 题解 首先,判断单调性,对于一个最大值mid,如果能够满足check(),那么mid+1,m 阅读全文
posted @ 2024-02-09 23:09 黑屿白 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题解 假设 a1 a2 a3 ... ak ak+1 ak+2 ... an是符合要求的数组, 那么我们可以推断出: a(k+1)=a(1)+1; a(k+2)=a(2)-1; ... a(2k+1)=a(k+1)+1; ... 因此我们知晓奇数位的数要比较小,偶数的位置要比较大;又题目说明一定有解 阅读全文
posted @ 2024-02-09 22:06 黑屿白 阅读(19) 评论(0) 推荐(0) 编辑
摘要:前言 拿到题目首先看数据量,n,q都是2e5的数量级,如果是暴力解的话时间复杂度会达到O(m*n)(最差情况 m次询问,每次l和r为1和n),很明显会超时。 这就意味着我们要在线性的时间内完成查询,即每次询问的查询时间保证在O(1)。 题解 准备一个数组b存储该连续相同数字串的起始点,然后我们从左向 阅读全文
posted @ 2024-02-09 21:56 黑屿白 阅读(21) 评论(0) 推荐(0) 编辑
摘要:题解 我们只需要遍历1~k,这时会有四种情况: 1、只存于a数组中。 2、只存于b数组中。 3、同时存于ab数组中。 4、不存在于ab数组中。 对于情况三,这种数我们不需要去管,因为它可以算在任意的数组上。 那么我们只需要判断情况一和二的数是否都<=k/2,并且情况一二三的数总和为k. Code # 阅读全文
posted @ 2024-02-09 19:10 黑屿白 阅读(13) 评论(0) 推荐(0) 编辑
摘要:题解 我们从左向右构建字符串。 每种数字我们都从a开始取,接下来我们用一个数组来存储对应数字下一次要取的字母。 Code #include<bits/stdc++.h> using namespace std; const int N=2e5+5; int b[N],a[N]; int main() 阅读全文
posted @ 2024-02-09 18:55 黑屿白 阅读(20) 评论(0) 推荐(0) 编辑
摘要:原题链接 二维差分的简单应用。作为学二维差分时的练手题很不错。 主要代码: #include<bits/stdc++.h> using namespace std; const int N=1002; int a[N][N]; int main(){ ios::sync_with_stdio(fal 阅读全文
posted @ 2024-02-06 16:43 黑屿白 阅读(11) 评论(1) 推荐(1) 编辑
摘要:原题链接 这道题是前缀和的简单应用。 我们可以将男生看为1,女生看为-1。那么题目要求的最长子数组的判断条件为该数组和是否为0。 首先我们对整个数组进行前缀和; 接下来假定该最长子数组在right位置(right进行遍历)结束,那么就有两种情况讨论: 1、该位置前缀和为0,那么与max进行比较。 2 阅读全文
posted @ 2024-02-05 16:48 黑屿白 阅读(25) 评论(0) 推荐(0) 编辑
摘要:原题链接 首先要读懂题目啊 :[Wj>=W] 其实是一种bool表达,即大于等于时取1,小于时取0,然后再进行求和。 根据要求出 最小值 大概可以猜测要运用二分,那么我们来判断单调性,首先W在所有矿石的最大最小值之间取值,W越小Y越大,W越大Y越小(观察和推理都很容易得到),那么Y是符合单调性的,即 阅读全文
posted @ 2024-02-03 14:48 黑屿白 阅读(26) 评论(0) 推荐(0) 编辑
摘要:原题链接 这是一道差分套差分的题,我们先求出某点水位和其上一点水位的差值,很显然这个差值序列也符合差分。 那么我们只需要一次差分再跑两遍前缀和即可。(如何差分要自己手动算出规律)。 其次,由于要求的是每个人落水点的水位,而我们在跑前缀和的时候,下标可能为负,所以我们把水位宽度平移M个单位,确保所有下 阅读全文
posted @ 2024-02-02 17:09 黑屿白 阅读(17) 评论(1) 推荐(0) 编辑
摘要:原题链接 算是 差分 的进阶吧,这道题算是差分+差分的题目,即要两次差分再求前缀和。 先来解释原理: 给定一个数组a长度为n,初始都为0。接下来m个操作:1、在l~r的范围上加上一个首项为s,末项为e的等差数列。接着求出m次操作后数组a的各项值 例如【0,0,0,0,0,0,0,0,0,0】的数组 阅读全文
posted @ 2024-02-02 16:31 黑屿白 阅读(21) 评论(0) 推荐(1) 编辑
摘要:原题链接 一道二分+差分的题目,作为学习前缀和 和 差分 的引入题目非常合适。 首先检验其单调性,如果一个申请人订单不用修改,那么其前面的申请人也不用修改,符合单调性。 接着,这道题暴力的思路就很简单,但是看到运算量(n,m高达1e6),暴力的时间复杂度为O(n*m)显然超时。 那么就是运用差分思想 阅读全文
posted @ 2024-02-01 20:40 黑屿白 阅读(12) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示