自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

我是蒋卫升呀~

竞赛算法

  • 博客(139)
  • 收藏
  • 关注

原创 二分图最佳匹配KM算法详解

在字节工作,投稿的文章

2022-07-21 18:55:05 316 1

原创 mac如何杀进程

比如我们想要杀死端口9999对应的进程首先,查看端口9999的占用情况lsof -i tcp:9999其次,执行kill -9 pid,这里我的pid = 9760kill -9 9760

2021-12-13 10:46:07 6077

原创 leetcode 两数相加(链表 + 模拟)

????/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} l1 * @param {ListNode} l2 * @return

2021-08-28 17:07:16 136

原创 代码最简洁的归并排序、快速排序

int a[maxn],cnt,b[maxn];void mer(int l,int mid,int r){ int i=l,j=mid+1; for(int k=l;k<=r;k++) { if(j > r || i <= mid && a[i] <= a[j])b[k] = a[i++]; else b[k] = a[j++],cnt += mid - i + 1; //cnt是逆序对数 }

2021-05-15 16:34:27 115

原创 Markdown转word标题

题目:给你一个数组,数组的每项都为Markdown格式,让你转化为word格式,保证是合理的。例子:[’#a’, ‘##b’, ‘##c", ‘###d’,’#e’]输出为:[ { hn:‘1’, titile: 'a"} , {hn: ‘1.1’,title: ‘b’}, {hn: ‘1.2’, title: ‘c’}, {hn: ‘1.2.1’, title: ‘d’} , {hn: ‘2’ , title: ‘e’}题解:用一个map,保存现在的一级标题是多少,以及一级标题下面的各级标题是多少。

2021-02-22 23:07:18 153

原创 leetcode 无重复字符的最长子串

题意:给你一个字符串,问你最长的无重复字符的子串有多长?题解:分析:tips: 使用js的用户注意0是falsy值!/** * @param {string} s * @return {number} */var lengthOfLongestSubstring = function(s) { let pre = {}; let mins = 0; let ans = 0; for(let i = 0; i < s.length; i++) {

2021-01-25 17:51:02 65

原创 leetcode 918.环形子数组的最大和

题意:给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。子数组要连续!important;题解:因为是环形,所以我们可以分为两种情况讨论包含两段只包含一段对于第一种情况,先求出数组的和,然后再再求出和最小的子数组,用和减去它即可对于第二种情况,我们直接求出和最大的子数组然后二者取最大值即可。和最小的子数组 && 和最大的子数组dp[i]=max(dp[i−1]+a[i],a[i])dp[i] = max(dp[i-1]+a[i], a[i]

2020-12-17 11:25:13 178

原创 leetcode 663. 均匀树划分

题意:给定一棵有 n 个结点的二叉树,你的任务是检查是否可以通过去掉树上的一条边将树分成两棵,且这两棵树结点之和相等。题解:树型dp,dp【i】代表i节点和它子树节点的总和,那么,我们先求出dp【root】,然后再判断是否存在某一个点,它的dp【i】= sum - dp【i】。如果有就返回true,否则返回false。/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val;

2020-12-08 14:04:36 2210

原创 leetcode 92 不同分二叉搜索树

题意:问1-n组成的二叉搜索树的种类有多少?题解:设f [ i ] :以 i 为根节点的二叉树种数,设G [ i ] :1 - i 组成的二叉搜索树的种数那么 G [ n ] = f [ 1 ] + f [ 2 ] + f [ 3 ] + ...... + f [ n ]f [ i ] = G [ i - 1] * G [ n - i ]那么:G [ n ] = G [ 0 ] * G [ n - 1] + G [ 1 ] * G [ n - 2] + ......这就是卡特兰数,我们可以用

2020-12-03 20:54:40 161

原创 树的层次遍历

题意:给你一颗树,求树的层次遍历题解:dfs | bfsdfs:设置一个变量用来保存树的深度/* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } *//** * * @param root TreeNode类 * @return int整型二维数组 */let ans = []function dfs(root,de

2020-11-26 15:40:15 236

原创 反转链表

题意:给你一个链表输出反转后的值题解:双指针/*function ListNode(x){ this.val = x; this.next = null;}*/function ReverseList(pHead){ // write code here let p = pHead let q = null let tmp = null while(p != null) { tmp = p p = p.ne

2020-11-26 15:25:04 146

原创 leetcode 5. 最长回文子串 (区间dp)

题意:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”题解:dp[i][j](boolean)dp[i][j](boolean)dp[i][j](boolean):代表iii到jjj是否是回文串首先预处理 长度为1,2的子串dp[i][j]dp[i][j]dp[i][j] = (dp[i+1

2020-11-24 22:19:37 226

原创 leetcode 15 三数之和 (M)

题目描述:给你一个数组,问有多少个三元组,他们的和为0,返回这些三元组,不包含重复的,比如(1,2,3)与(3,2,1)是同一个三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]题解:首先,如果暴力枚举的话,时间复杂度是:n的三次方。而且还要去重。那么我们可以考虑,是否可以通过排序,让我们找到的三元组的顺序有规律来减少不必要的枚举次数,显然是可行的,我们先把数组按照从小到大的顺序排

2020-11-18 19:26:19 138

原创 leetcode 236 二叉树的最近公共祖先

题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。树的输入是按照层次来的,这样就是保证i∗2i*2i∗2位置是左边儿子,i∗2+1i*2+1i∗2+1是右儿子。示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1 的最近公共祖先是节点 3。示例 2:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4输出: 5解

2020-11-16 20:14:08 210

原创 leetcode 42 接雨水

题目描述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。题解思路:我们考虑每个柱子上面能接的雨水是由什么决定的,不难得出,每根柱子上能接的雨水是由它左边的最高的柱子和他右边的最高的柱子中的最小值决定的。那么我们可以维护一个前缀最小值和一个后缀最小值,最终我们就可以得出每根柱子上面能接多少雨水,最后把每根柱子上面接的雨水加起来就是最终答案/** * @param {number[]} height * @return {number} */

2020-11-16 19:27:33 153

原创 leetcode 211 最大正方形

题意:给你一个n*m的矩形,矩形中只包含0,1这两种元素,问这个矩形中全部为1的正方形的面积时多少?题解:设dp[i][j]dp[i][j]dp[i][j]为:以(i,j)(i,j)(i,j)这个位置为终点,能组成正方形的最大边长,那么当(i.j)(i.j)(i.j)这个位置的值为1时,dp[i][j]=min(dp[i−1][[j],dp[i][j−1],dp[i−1][j−1])+1dp[i][j] = min(dp[i-1][[j],dp[i][j-1],dp[i-1][j-1]) + 1dp[

2020-11-15 17:28:29 110

原创 leetcode 213. 打家劫色II

link题意:有n个房子围成一圈,其中第i个房子里有a[i]个金币,你是一个小偷,如果偷两个连在一起的房子就会报警,问你,如何偷窃可以使得金币最多而且不会被抓。思路:因为这些房间时围成一个圈的,偷了第一个房间,就不能偷最后一个房间。那么我们就分情况讨论,情况一:必偷最后一个房间,情况二:不偷最后一个房间,那么,对于情况一,就相当于移除了第一项和最后两项,变成了题(198 打家劫色),对于情况二,就相当于移除最后一项变成了(198 打家劫色)tips:我感觉它这个题还是不够严谨,因为如果n等于2的时候,

2020-11-11 15:33:03 188

原创 leetcode 921使括号有效的最小添加方式

link题意:给你一个只包含"(" 和 ")"两种字符的字符串,问添加多少个字符才能使得这个字符串合法,合法就是每对括号都匹配成功题解:直接匹配,如果匹配成功就继续,如果失败就添加字符串/** * @param {string} S * @return {number} */var minAddToMakeValid = function(s) { let cnt = 0 let ans = 0 for(let i = 0; i < s.length; i++)

2020-11-08 16:48:48 173

原创 leetcode 946验证栈序列

link题意:验证一个序列是不是另外一个序列的入栈顺序题解:用双指针分别指向这两个序列的起始位置,把pushed序列加入到栈中,如果此时栈顶元素跟出栈序列中的值相同,就pop出去,移动指针,如果最后有一个序列已经遍历完成,而栈不为空,就说明它不是poped序列的出栈序列/** * @param {number[]} pushed * @param {number[]} popped * @return {boolean} */var validateStackSequences = func

2020-11-08 10:51:50 209

原创 leetcode 20 有效括号对 (栈)

link题意:匹配括号题解:栈/** * @param {string} s * @return {boolean} */var isValid = function(s) { let stack = []; for(let i = 0; i < s.length; i++) { if (s[i] == '(' || s[i] == '[' || s[i] == '{'){ stack.push(s[i]); } e

2020-11-08 10:25:08 143

原创 牛客 F地铁(最短路)

????题意:给你n个站点,m条线路(n,m<=1e5),每条线路(边)有一个时间,代表乘坐这条线路花费的时间,有一个线路号(1-n),如果你换乘了,那么,消耗的时间就多了abs(pre_c - now_c),问你从站点1到站点n,至少需要多少时间。题解:因为这个换乘的性质导致了他不能用点来贪心,也就没有办法使用dijkstra,下面的样例可以说明。但是用边来贪心刚好满足性质,我们设d[i]代表从i点出发经过了第i条边的最小值,这样就符合了贪心的原理,我们就可以根据dijkstra求出所有

2020-10-14 11:20:12 234

原创 糖糖别胡说,我真的不是签到题目 (逆向思维)三星

题意:链接:https://ac.nowcoder.com/acm/problem/14583来源:牛客网有n只萌萌的糖糖,他们分成了两组一起玩游戏。他们会排成一排,第i只糖糖会随机得到一个能力值bi。从第i秒的时候,第i只糖糖就可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的糖糖。为了使游戏更加有趣,糖糖的爸爸,娇姐,会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,…,bci都会增加1.现在,娇姐想知道在第n秒后,会有多少只糖糖存活下来。题解:从后往前考虑,第i

2020-10-01 16:43:50 276

原创 Codeforces Round #669 (Div. 2) A (思维)

题意:给你一个长度为n(n是偶数)的串,让你删除不超过n/2个元素,使得原来的串,奇数位置的值的和等于偶数位置的和,输出删除后的串。题解:

2020-09-14 08:55:31 137

原创 Codeforces Round #670 (Div. 2) B (枚举)

#include <bits/stdc++.h>#define pb push_back#define ll long longusing namespace std;int main(){ int T; cin >> T; while(T--) { int n; cin >> n; int flag = 0; vector<int>z,f; for(int i=1;i<=n;i++) { int x;

2020-09-14 08:42:34 182

原创 Codeforces Round #670 (Div. 2) A-D

题目????:link题解连接:A. Subset MexB. Maximum ProductC. Link Cut CentroidsD. Three Sequences学习连接:https://blog.csdn.net/zstuyyyyccccbbbb/article/details/108560772

2020-09-13 20:08:28 193

原创 Codeforces Round #670 (Div. 2) C(树的重心)

题意:给你一棵树,你可以删除一条边,添加一条边(可以删除添加同一条),使得这棵树的重心唯一,输出删除的边,和添加的边。前置知识:树的重心及性质首先要知道什么是树的重心,树的重心就是:树中的一个节点,他满足,删除这个节点,剩下若干个连通块,这若干个连通块中最大的那个最小。重心一些基本性质有:删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心;树中所有节点到重心的距离之和最小,如果有两个重心,那么他们距离之和相等;两个树通过一条边合并,新的重心在原树两个重心的路径上;

2020-09-13 20:01:42 197

原创 Codeforces Round #669 (Div. 2) D (单调队列转移dp)

题意:给你n根柱子,你在第一根柱子上,要跳到第n根柱子,问你最少要跳几下。能从一根柱子跳到另外一根柱子的条件是:这两根柱子严格比他们中间的所有柱子高这两根柱子严格比他们中间的所有柱子低前一根柱子跳到后一根柱子满足其中一个就可以了。题解:首先dp【i】代表的是从第一根柱子跳到第iii根柱子上,最少要跳几下。我们中后往前看,那么第三个条件的方程是:dp[i]=dp[i−1]+1dp[i] = dp[i-1]+1dp[i]=dp[i−1]+1;第2个条件,我们可以用单调栈维护一个递减

2020-09-13 13:58:19 242

原创 Codeforces Round #669 (Div. 2) A-D

题目连接:????链接题解链接:A. AhahahahahahahahaB. Big VovaC. Chocolate BunnyD. Discrete Centrifugal Jumps

2020-09-12 20:33:45 196

原创 Codeforces Round #669 (Div. 2) C (交互题)

题意:交互题~输入一个n,代表一个1-n的全排列最多2*n次询问,每次询问: ? a b,系统会返回第a个位置的数mod第b个位置的数的结果(既P_a %P_b )。问:这个排列是什么题解:对于一对位置,我们做两次询问: ? a b , 然后询问 ? b a,那么我们就可以得到P_a和P_b中较小的数,每两次操作就可以得到一个数,但是只有这个操作,得不到排列中最大的那个数,所以我们的有效操作次数和必要操作次数其实是2*(n-1),最后一个数必然是n。#include <bits/

2020-09-12 20:21:01 135

原创 LOJ 数列分块入门 2

link需要思考的问题:完整的块如何处理不完整的块如何处理需要预处理什么东西题解预处理对于每一块,我们用一个vector保存这个块中所有的值,并且对这个vector排序。目的是为了方便我们后面的二分操作。对于完整的块更新:我们用lz[i]lz[i]lz[i]保存第i块整块要加的值。查询:lowerlowerlower_ boundboundbound查询这个块中小于c减lz[i]的值的个数,因为本来这个块中所有的数都要加lz[i]。对于不完整的块更新:直接更

2020-08-17 16:45:34 167

原创 LOJ 数列分块入门 1

link分块优雅的暴力,对于一个数列,他不是一个元素一个元素处理,而是分成若干块,成块成块的处理,以此达到降低时间复杂度的目的。需要处理的信息首先,我们需要处理划分的块的大小—block(一般是根号n)、块的数目、每一个元素对应第几块,然后,每一块的左端点和右端点。需要思考的问题:完整的块如何处理不完整的块如何处理需要预处理什么东西题解完整的块:更新:我们用lz[i]lz[i]lz[i]保存第iii个块整块都要加上某个数的总和。不完整的块:更新:直接更新。查询:返回这个

2020-08-17 15:40:42 170

原创 2020牛客暑期多校训练营(第二场)A F G J H

A. All with Pairs题意:给你n个字符串,f(s,t)f(s,t)f(s,t)代表最大的iii满足s0…i等于tlen-i+1…len。要你求出∑i=1n\sum_{i=1}^n∑i=1n​∑j=1n\sum_{j=1}^n∑j=1n​ f(si,sj)f(si,sj)f(si,sj) 2 %(998242353)题解:先预处理每个字符串的后缀并把它保存到map中,然后,遍历每个字符串,从后往前遍历(因为题目让我们求最大的i),在map中找这个串,更新答案,ans+=mp[hashSi

2020-07-24 17:08:33 217

原创 组合数的几种常见计算方法

加法递推 :o(n∗n)o(n*n)o(n∗n)公式:C(mn)C\tbinom{m}{n}C(nm​) = C(mn−1)C\tbinom{m}{n-1}C(n−1m​)+C(m−1n−1)C\tbinom{m-1}{n-1}C(n−1m−1​)理解:这是把他分成了两种情况:必选某一个、不选某一个ll C[1001][1001];memset(C,0,sizeof(C));for(int i=0;i<=n;i++){ C[i][0] = 1; for(int j=0;j<=i

2020-07-19 21:07:23 2500

原创 Codeforces Round #656 (Div. 3) E(拓扑排序)

题意给你一个图,图中有无向边和有向边,要你把无向边变成有向边,问有没有一种变法,是的图没有环,如果有输出yes,并且输出这个变化方案,如果没有输出no。题解其实打比赛的时候就有点想法,但是没有时间了。就直接topsort,排序的时候,如果碰到无向边,就给他加一个方向就可以了,具体看代码吧。#include <bits/stdc++.h>#define ll long long#define pi pair<int,int>#define mk make_pair#de

2020-07-19 19:53:25 103

原创 2020年牛客算法入门课练习赛3 (全部题解)

题目连接A 胖胖的牛牛题解:用优先队列实现bfs,保存五个信息,当前坐标的x,y值;上一步的坐标值,pre_x,pre_y;从起点到这个点一共转了多少次方向val。那么如果当前的x,y与他前一步的前一步的x,y都不相等,代表转了一个方向,更新val,加入到优先队列中,如果执行完bfs还没有到终点输出-1即可#include <bits/stdc++.h>#define ll long long#define pi pair<int,int>#define mk make_

2020-07-16 12:02:57 422

原创 洛谷 P4009 汽车加油行驶问题 (分层图最短路)

题目要满足三个条件:1:汽车经过一条网格边时,若其 X 坐标或 Y 坐标减小,则应付费用 B ,否则免付费用。2:汽车在行驶过程中遇油库则应加满油并付加油费用 A。3:在需要时可在网格点处增设油库,并付增设油库费用 C(不含加油费用A )。4:汽车只能沿网格边行驶,装满油后能行驶 K 条网格边。思路:这题是洛谷网络流24题里的,但是题解都是清一色的最短路哈哈。建图跑最短路。根据费用分层,因为装满油只能走k次,所以我们分为k+1层,第0层代表满油,第一层代表消耗了一单位油。对于第一个条件:我们在这

2020-07-08 16:12:04 265

原创 洛谷 P4014 分配问题 (费用流解决二分图最优匹配)

link思路:用矩阵的行列建图,跑费用流即可,存个板子#include <bits/stdc++.h>#define ll long long#define pi pair<int,int>#define mk make_pair#define pb push_backusing namespace std;const int maxn = 10005;const int maxm = 1000005;const int inf = 0x3f3f3f3f;s

2020-07-07 11:29:36 216

原创 洛谷 P2756 飞行员配对方案问题(最大流求二分图最大匹配)

link题目:求二分图最大匹配思路:二分图最大匹配有匈牙利算法,但是也能用网络流求解。我们设置二分图左边的点集为A,设置二分图右边的点集为B,我们从A到B连一条有向边,边权为1,我们设置一个超级源和一个超级汇点。超级源连有向边到A集,B集连有向边到超级汇。用dinic算法求出最大流,最大流就是最大匹配,匹配边就是正向边中流量不为0的边。code:#include <bits/stdc++.h>#define ll long long#define pi pair<int,int

2020-07-05 17:44:14 171

原创 UVA 11248 Frequency Hopping (最大流模板)

题意:给定一个网络,每条边都有一个容量,问是否存在1到n的流量为c的流。如果存在,输出possible,如果不存在,是否可以通过修改一条这样的边的容量,使得存在这样的流?如果有若干个答案,排序后输出。题解:求出最大流,如果大于等于c,就存在,否则,算出最小割,如果,把最小割中的流量增加到c,再求最大流,如果此时的最大流满足大于c,保存答案。因为这样写会超时,所以用到白书给的两个优化。code:#include<cstdio>#include<cstring>#include

2020-07-05 16:49:11 142

原创 CCSU training contest(2)

linklinklinkj Janitor Troubles给你四边形四条边,求能组成的四边形面积的最大值如果,给了三条边,那么组成的三角形就是确定的,面积是定值,我们可以根据海伦公式求出来。给了四条边也有公式:面积最大,令角度为0即可,证明过程:linklinklink海伦公式:来自百度百科...

2020-07-02 15:50:16 129

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除