- 博客(50)
- 收藏
- 关注
原创 讲解
扩展欧几里得算法用于求解方程 ax+by=gcd(a,b) 的解当 b=0时 ax+by=a 故而 x=1,y=0当 b≠0 时 gcd(a,b)=gcd(b,a%b)对于gcd(b,a%b) bx′+(a%b)y′=gcd(b,a%b) bx′+(a−⌊a/b⌋∗b)y′=gcd(b,a%b) ay′+b(x′−⌊a/b⌋∗y′)=gcd(b,a%b)=gcd(a,b)
2020-10-31 00:45:47
394
1
原创 861. 二分图的最大匹配
#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int N = 100010;int n1, n2, m;int match[N];bool st[N];int h[N],e[N],ne[N],idx;void add(int a, int b){ e[idx] = b, .
2020-10-16 22:29:51
124
原创 860. 染色法判定二分图
#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int N = 200010;int n, m;int h[N], e[N],ne[N],idx;int color[N];//判断这个点是否已经染色;void add(int a, int b){ e[idx] = b, ne[.
2020-10-15 23:29:41
114
原创 859. Kruskal算法求最小生成树
思路:1.将所有边按权重从小到大排序;2.枚举每条边a——b, 权重为c,if a , b不连通将这条边加入集合中。(运用之前学的并查集)#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int N = 200010;struct NODE{ int a, b, c; .
2020-10-13 23:05:43
107
原创 858. Prim算法求最小生成树
思路:将所有点到集合的距离初始化为正无穷;进行n次循环;找到不在集合中且到集合距离最近的点;用找到的点来更新其它点到集合的距离;#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int N = 510;int n, m;int g[N][N];int dist[N];bool.
2020-10-13 22:01:11
310
1
原创 854. Floyd求最短路
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;const int N = 210;int d[N][N];int n, m, k;//三重循环;void floyd(){ for(int k = 1; k <= n; k ++) { for(int i .
2020-10-12 21:28:12
156
原创 852. spfa判断负环
#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>#include<queue>using namespace std;const int N = 2010, M = 10010;int h[N],e[M],ne[M],w[M],idx;int dist[N], cnt[N];bool st[N];int n, m;//当.
2020-09-26 18:50:52
112
原创 851. spfa求最短路(用队列优化bellman——ford算法)
#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>#include<queue>using namespace std;const int N = 100010;int h[N],e[N],ne[N],w[N], idx;bool st[N];//判断这个点是否已经在队列中int dist[N];int n, m;void.
2020-09-26 18:18:17
119
原创 853. 有边数限制的最短路(Bellman_ford算法)
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;struct NODE{ int a; int b; int c;};const int N = 510, M = 10010;int dist[N], last[N];int n, m, k;NODE node[M];.
2020-09-24 18:34:31
140
原创 850. Dijkstra求最短路 II(堆优化版的Dijkstra算法)
#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>#include<queue>using namespace std;typedef pair<int,int> PII;//堆中存储的一个是这个点的距离,一个是这个点的编号。const int N = 150010;int dist[N];int n, m;boo.
2020-09-24 13:37:51
174
原创 849. Dijkstra求最短路 I
#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int N = 510;int g[N][N];//稠密用邻接矩阵存储int dist[N];//存储每个点到1号点的最短距离bool st[N];//判断每个点到1号点的最短距离是否确定int n, m;int dijkstra().
2020-09-23 20:12:28
95
原创 848. 有向图的拓扑序列
#include<cstring>#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int N = 100010;int n, m;int q[N], d[N];//q[N]是将入度为0的点存入队列,d[N]表示点的入度数量。int h[N], e[N],ne[N],idx;void add(int a, int b){.
2020-09-23 18:23:37
117
原创 847. 图中点的层次
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int N = 100010;int n, m;int h[N], e[N],ne[N], idx;int d[N], q[N];void add(int a, int b){ e[idx] = b, ne[idx] = h[a], h.
2020-09-23 17:42:19
93
原创 846. 树的重心
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 100010, M = N * 2;int h[N], e[M], ne[M], idx;bool st[N];//判断这个点是否被走过int n;int ans = N;//记录所有被除去一个点后所有连通块中点的数量最大中的最小void add(int a, in.
2020-09-17 14:10:05
118
原创 844. 走迷宫
#include<iostream>#include<algorithm>#include<cstring>using namespace std;typedef pair<int,int> PII;const int N = 110;int map[N][N], d[N][N];//d数组存点到起点的距离PII q[N*N];int n, m;int bfs(){ //写一个队列,并把初始状态写入队列中 int .
2020-09-11 13:00:26
154
原创 843. n-皇后问题
#include<iostream>using namespace std;const int N = 20;char path[N][N];bool row[N], col[N],dg[N], udg[N];int n;void dfs(int x, int y, int u){ if(y == n) y = 0, x ++; if(x == n) { if(u == n) { fo..
2020-09-08 20:02:58
1025
原创 842. 排列数字
#include<iostream>using namespace std;const int N = 10;int n;int path[N];bool st[N];void dfs(int u){ if(u == n) { for(int i = 0; i < n; i ++) cout << path[i] << ' '; cout << endl; } for(int i = 1; i <= n.
2020-09-08 15:28:50
141
原创 2020-08-17
P3367 【模板】并查集基本原理:每个集合用一个树来表示。树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。#include<iostream>#include<algorithm>#include<stdio.h>using namespace std;const int N = 10010;int p[N];//表示父节点int find(int x)// 找到x的祖宗节点 + 把路径上所有点的父节点变为祖宗节点
2020-08-20 22:31:49
181
原创 840. 模拟散列表
维护一个集合,支持如下几种操作:“I x”,插入一个数x;“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。输出格式对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。每个结果占一行。数据范围1≤N≤105−109≤x≤109输入样例:5I 1I 2I 3Q 2Q
2020-07-30 16:52:31
144
原创 839. 模拟堆
维护一个集合,初始时集合为空,支持如下几种操作:“I x”,插入一个数x;“PM”,输出当前集合中的最小值;“DM”,删除当前集合中的最小值(数据保证此时的最小值唯一);“D k”,删除第k个插入的数;“C k x”,修改第k个插入的数,将其变为x;现在要进行N次操作,对于所有第2个操作,输出当前集合的最小值。输入格式第一行包含整数N。接下来N行,每行包含一个操作指令,操作指令为”I x”,”PM”,”DM”,”D k”或”C k x”中的一种。输出格式对于每个输出指令“PM”,输出一
2020-07-30 16:06:34
141
原创 838. 堆排序
输入一个长度为n的整数数列,从小到大输出前m小的数。输入格式第一行包含整数n和m。第二行包含n个整数,表示整数数列。输出格式共一行,包含m个整数,表示整数数列中前m小的数。数据范围1≤m≤n≤105,1≤数列中元素≤109输入样例:5 34 5 1 3 2输出样例:1 2 3#include<iostream>#include<algorithm>using namespace std;const int N = 100010;int n,
2020-07-30 14:57:40
73
原创 837. 连通块中点的数量
给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。现在要进行m个操作,操作共有三种:“C a b”,在点a和点b之间连一条边,a和b可能相等;“Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等;“Q2 a”,询问点a所在连通块中点的数量;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“C a b”,“Q1 a b”或“Q2 a”中的一种。输出格式对于每个询问指令”Q1 a b”,如果a和b在同一个连通块中,则输出“Yes”,否则输出“N
2020-07-29 16:18:48
138
原创 836. 合并集合
一共有n个数,编号是1~n,最开始每个数各自在一个集合中。现在要进行m个操作,操作共有两种:“M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;“Q a b”,询问编号为a和b的两个数是否在同一个集合中;输入格式第一行输入整数n和m。接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。输出格式对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内,则输出“Yes”,否则输出“No”。每个结果占一行
2020-07-29 15:41:09
113
原创 2.8 Trie
维护一个字符串集合,支持两种操作:“I x”向集合中插入一个字符串x;“Q x”询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。输出格式对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗104输入样例:5I abcQ abcQ abI ab
2020-07-29 14:45:48
107
原创 2.7 KMP
给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串P在模式串S中多次作为子串出现。求出模板串P在模式串S中所有出现的位置的起始下标。输入格式第一行输入整数N,表示字符串P的长度。第二行输入字符串P。第三行输入整数M,表示字符串S的长度。第四行输入字符串S。输出格式共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开。数据范围1≤N≤1051≤M≤106输入样例:3aba5ababa输出样例:0 2#incl
2020-07-29 13:45:25
219
原创 2.6 单调队列
给定一个大小为n≤106的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。您只能在窗口中看到k个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为[1 3 -1 -3 5 3 6 7],k为3。您的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。输入格式输入包含两行。第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长度。第二行有n个整数,代表数组的具体数值。同行数据之间用空格隔开。输出格式输出包含两个。第一行输出,从左至右,每个位置滑动窗口
2020-07-23 12:43:00
42
原创 2.5 单调栈
给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出-1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出-1。数据范围1≤N≤1051≤数列中元素≤109输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2#include<iostream>using namespace std;const int N =
2020-07-22 17:08:19
160
原创 2.4 队列
实现一个队列,队列初始为空,支持四种操作:(1) “push x” – 向队尾插入一个数x;(2) “pop” – 从队头弹出一个数;(3) “empty” – 判断队列是否为空;(4) “query” – 查询队头元素。现在要对队列进行M个操作,其中的每个操作3和操作4都要输出相应的结果。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。输出格式对于每个”empty”和”query”
2020-07-22 16:37:11
264
原创 2.3 栈
实现一个栈,栈初始为空,支持四种操作:(1) “push x” – 向栈顶插入一个数x;(2) “pop” – 从栈顶弹出一个数;(3) “empty” – 判断栈是否为空;(4) “query” – 查询栈顶元素。现在要对栈进行M个操作,其中的每个操作3和操作4都要输出相应的结果。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令为”push x”,”pop”,”empty”,”query”中的一种。输出格式对于每个”empty”和”query”操作都要
2020-07-22 16:14:40
95
原创 2.2 双链表
实现一个双链表,双链表初始为空,支持5种操作:(1) 在最左侧插入一个数;(2) 在最右侧插入一个数;(3) 将第k个插入的数删除;(4) 在第k个插入的数左侧插入一个数;(5) 在第k个插入的数右侧插入一个数现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。输入格式第一行包含整数M,表示操作次数。
2020-07-22 15:53:28
239
原创 2.1 单链表
实现一个单链表,链表初始为空,支持三种操作:(1) 向链表头插入一个数;(2) 删除第k个插入的数后面的数;(3) 在第k个插入的数后插入一个数现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。输入格式第一行包含整数M,表示操作次数。接下来M行,每行包含一个操作命令,操作命令可能为以下几种:(1) “
2020-07-21 20:17:30
122
原创 AcWing 803. 区间合并
给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3]和[2,6]可以合并为一个区间[1,6]。输入格式第一行包含整数n。接下来n行,每行包含两个整数 l 和 r。输出格式共一行,包含一个整数,表示合并区间完成后的区间个数。数据范围1≤n≤100000,−109≤li≤ri≤109输入样例:51 22 45 67 87 9输出样例:3#include<iostream>#
2020-07-21 16:15:37
162
原创 AcWing 802. 区间和
假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。输入格式第一行包含两个整数n和m。接下来 n 行,每行包含两个整数x和c。再接下里 m 行,每行包含两个整数l和r。输出格式共m行,每行输出一个询问中所求的区间内数字和。数据范围−109≤x≤109,1≤n,m≤105,−109≤l≤r≤109,−10000≤c≤100
2020-07-21 15:37:35
300
原创 AcWing 801. 二进制中1的个数
给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。输入格式第一行包含整数n。第二行包含n个整数,表示整个数列。输出格式共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。数据范围1≤n≤100000,0≤数列中元素的值≤109样例输入样例:51 2 3 4 5输出样例:1 1 2 1 2通过运用lowbit(x)来计算x的最后一位1, 然后将x - lowbit(x),每减一次,都将res = 0 加上1, 直到x为0时停止
2020-07-15 14:39:24
245
原创 AcWing 800. 数组元素的目标和
给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i] + B[j] = x的数对(i, j)。数据保证有唯一解。输入格式第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。第二行包含n个整数,表示数组A。第三行包含m个整数,表示数组B。输出格式共一行,包含两个整数 i 和 j。数据范围数组长度不超过100000。同一数组内元素各不相同。1≤数组元素≤109输入样例:4 5 61 2 4 73 4 6 8 9输出样例:
2020-07-14 14:41:20
181
原创 AcWing 799. 最长连续不重复子序列
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。输入格式第一行包含整数n。第二行包含n个整数(均在0~100000范围内),表示整数序列。输出格式共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。数据范围1≤n≤100000样例输入样例:51 2 2 3 5输出样例:3这题运用双指针算法,关键是求j,i区间中是否有重复数(通过另一个数组b[]来实现),只要当j,i区间中有重复数出现,就将另一个数组b[j]减一,然后将j加1,直到i=
2020-07-14 14:08:07
203
原创 AcWing 798. 差分矩阵
输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上c。请你将进行完所有操作后的矩阵输出。输入格式第一行包含整数n,m,q。接下来n行,每行包含m个整数,表示整数矩阵。接下来q行,每行包含5个整数x1, y1, x2, y2, c,表示一个操作。输出格式共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。数据
2020-07-12 18:16:44
87
原创 AcWing 797. 差分
输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l, r, c,表示将序列中[l, r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包含三个整数l,r,c,表示一个操作。输出格式共一行,包含n个整数,表示最终序列。数据范围1≤n,m≤100000,1≤l≤r≤n,−1000≤c≤1000,−1000≤整数序列中元素的值≤1000这题最重要的是表示出输入的数组a[]的差分
2020-07-12 17:04:32
244
原创 AcWing 796. 子矩阵的和
输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式第一行包含三个整数n,m,q。接下来n行,每行包含m个整数,表示整数矩阵。接下来q行,每行包含四个整数x1, y1, x2, y2,表示一组询问。输出格式共q行,每行输出一个询问的结果。数据范围1≤n,m≤1000,1≤q≤100000,1≤x1≤x2≤n,1≤y1≤y2≤m,−1000≤矩阵内元素的值≤1
2020-07-12 15:55:12
283
原创 AcWing 795. 前缀和
输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。输出格式共m行,每行输出一个询问的结果。数据范围1≤l≤r≤n,1≤n,m≤100000,−1000≤数列中元素的值≤1000样例5 32 1 3 6 41 21 32 4答案:3610a[1], a[2],
2020-07-12 15:23:42
190
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人