自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 牛站(恰好经过k条边的最短路)

牛站类似于矩阵快速幂,在floyd中,d[i][j] = min(d[i][j],d[i][k] + d[k][j])表示将d[i][j]更新成可经过k个点的最短路,在这题中,d[i][j]表示经过k条边的最短路。所以对于给定的k,利用快速幂将k将为logk,对每一位1更新res。(记得离散化)。具体看注释。#include<bits/stdc++.h>using namespace std;const int N = 210;int k,m,s,e,n;int g[N][N

2021-11-12 21:33:58 546

原创 观光之旅(无向图的最小环问题)

观光之旅见注释:#include<bits/stdc++.h>using namespace std;const int N = 110;int n,m,cnt;int g[N][N],d[N][N];int pos[N][N];int path[N];void get_path(int i,int j)//递归找经过的点{ if(pos[i][j] == 0) return ; int k = pos[i][j]; get_

2021-11-12 17:57:27 790

原创 排序(传递闭包 floyd)

排序按照a < b则在a和b中连一条长度为1的边建图,d[a][b] = 1表示a小于b,每加入一组数据跑一边floyd,(实际上就是动态规划更新一下每个点能到的点),判断三种情况:存在d[i][i] = 1,i 大于 i 说明存在矛盾。存在d[i][j] = 0 && d[j][i] = 0说明无法判断 i 和 j 的大小,无法确定关系。否则可以确定,输出大小可以类似于拓扑排序的思想输出。#include<bits/stdc++.h>using names

2021-11-12 17:41:33 754

原创 dijkstra的应用

昂贵的聘礼建立一个虚拟点,从虚拟点到每个点连一条边表示直接买某件物品的价格,所以从虚拟点走到1的最短路就是得到结果的最小价值。对于题目的地位限制,可以对每个满足地位的区间分别做一次dijkstra取最小值即可#include<bits/stdc++.h>using namespace std;const int N = 110;const int inf = 0x3f3f3f3f;int n,m,g[N][N],d[N],level[N];bool st[N];in

2021-11-12 17:13:34 1460

原创 拓扑排序的应用

由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。于是Mr.Z下令召开 m 方会谈。每位参加会谈的代表提出了自己的意见:“我认为员工 a 的奖金应该比 b 高!”Mr.Z决定要找出一种奖金方案,满足各位代表的意见,且同时使得总奖金数最少。每位员工奖金最少为100元,且必须是整数。输入格式第一行包含整数 n,m ,分别表示公司内员工数以及参会代表数

2021-11-12 13:39:09 414

原创 拓扑排序模板

拓扑排序用于有向无环图。维护一个队列,其中的元素都是入度为0的结点,每次取出队头的元素,枚举它连接的每一个点,将那些入度减一,如果有结点入度减到了0,加入队列,那么队列中入队的顺序即为拓扑序,拓扑序不唯一。由于需要入队的顺序,所以用手写队列直接在队列数组中记录拓扑序,q[0] - q[n - 1]的顺序即为拓扑序。const int N = 110,M = N * N;int n,d[N],q[N];int h[N],e[M],ne[M],idx;//d表示入度void topu.

2021-11-12 11:28:44 212

原创 最小生成树模板

可用于带重边、自环以及负权的无向图。Prim算法:每次选出一个离集合最近的点,加入集合,依次类推,直到最小生成树的建成。有两个版本,朴素版本复杂度:O(N2),堆优化版本复杂度:O(mlogm)。由于kruskal更常用,只贴一个朴素版本的模板。int prim(){ memset(d,0x3f,sizeof(d)); int res = 0; for(int i = 0; i < n; i ++ ) { int t = -1; .

2021-11-12 11:12:00 123

原创 单点修改+区间最大连续子段和

小白逛公园因为是区间最大子段和,所以除了左右两边子段和取最大,还要考虑合并之后是否更大,所以还需要对每个节点存最大前缀和和最大后缀和。最大前缀和等于左儿子的最大前缀和和左儿子的总和加上右儿子的最大前缀和,所以还需要存每个节点的总和。还要注意在查询的时候还要考虑合并子段的问题代码:#include<bits/stdc++.h>using namespace std;const int N = 500010;int w[N],n,m,x,y,op;struct stu

2021-09-22 12:21:00 203

原创 单点修改+查找区间最大值

最大数#include<bits/stdc++.h>using namespace std;const int N = 200010;int a,t,p,l,m,n;struct stu{ int l,r; int v;//根据pushup定义所需的变量} tr[N * 4];void pushup(int u)//用两个子结点更新父节点{ tr[u].v = max(tr[u * 2].v,tr[u * 2 + 1].v);}void b

2021-09-22 12:11:10 330

原创 快速幂模板 快速幂求逆元

快速幂用来在Ologk 的时间内求出 a ^ k mod p的值。先预处理出a ^ 2 ^ 0,a ^ 2 ^ 1 … a ^ 2 ^ logk的值,再根据k的位运算乘a。代码:int ksm(int a,int k,int p){ int res = 1; while(k) { if(k & 1) res = (ll)res * a % p; k >>= 1; a = (ll)a *.

2021-09-10 22:59:05 131

原创 acwing-Hankson的趣味题(筛约数)

Hankson的趣味题题意是给abcd四个数,求有多少个x满足gcd(a,x)==b,lcm(c,x)==d.由于lcm(c,x)==d,所以x一定是d的约数,所以可以求出d的所有约数再判断是否符合条件。第一种:试除法求约数,会超时。第二种:筛出1 - sqrt d 的所有质数,再爆搜出d的所有约数判断是否符合条件。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pai

2021-09-09 09:05:34 117

原创 acwing-质数距离(筛选区间质数)

质数距离由于线性筛只能从头开始筛起,所以对于比较数值比较大的一个区间,采用线性筛无法在较好的时间内筛出结果。可以筛出 1 - sqrt n 中的所有质数,对于每个质数,将他在区间内的倍数标记,所有未被标记的则是区间内所有质数。关键:区间左端点上取整,右端点下取整。区间内的数过大,数组存不了可以减去区间左端点。代码:#include<bits/stdc++.h>using namespace std;const int N = 45000;int prime[N],

2021-09-09 08:54:48 112

原创 2021ccpc网络预选赛部分题解

Cut The Wire电线数量为左边路灯中偶数的数量加上奇数且3x + 1 > n的数量。代码:#include<bits/stdc++.h>using namespace std;int T,x,num;int main(){ cin>>T; while(T -- ) { cin>>x; num = 0; int t = x / 3;

2021-09-01 20:07:40 734

原创 最大公约数Ⅱ(欧拉函数)

最大公约数求GCD(x,y) 为素数的数对 (x,y) 有多少对。关键:将x y 拆成 a * d,b * d,(d为素数)、前缀和优化、phi[1]的另外处理.题解转自秦大佬题解。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 10000010;ll prime[N],phi[N],n,idx,sum[N],ans;bool st[N];void

2021-08-26 21:51:57 151

原创 欧拉函数

欧拉函数:f(n):1 ~ n 中与 n 互质的数的个数。互质:两个数的最大公约数为1时,两个数互质。分解质因数公式:N = a1 ^ p1* a2 ^ p2 * … * ak ^ pk欧拉函数公式:f(N): N * (1 - 1 / p1)(1 - 1 / p2)…(1 - 1 / pk)证明:(容斥原理)1、1 ~ n 去掉 p1,p2,…pk的倍数(不可能互质)2、加上所有pi * pj的倍数3、减去所有pi * pj * pk倍数,以此类推,得到公式代码:#include.

2021-08-26 17:40:10 992

原创 acwing - 轻拍牛头

今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏.贝茜让 N 头奶牛(编号 1 到 N )坐成一个圈。除了 1 号与 N 号奶牛外, i 号奶牛与 i−1 号和 i+1 号奶牛相邻, N 号奶牛与 1 号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张纸条中包含一个 1 到 1000000 之间的数字。接着每一头奶牛 i 从桶中取出一张纸条,纸条上的数字用 Ai 表示。所有奶牛都选取完毕后,每头奶牛轮流走上一圈,当走到一头奶牛身旁时,如果

2021-08-26 15:37:53 236

原创 Week-2

最大面积详解可看csdn代码:#include<bits/stdc++.h>using namespace std;const int N = 2010;int n,m;char g[N][N];int l[N],r[N],q[N];int U[N],D[N],L[N],R[N];int s[N][N];int cacl(int a[],int n)//单调栈计算最大值{ int tt = 0; a[0] = a[n + 1] = -1;

2021-08-26 12:04:12 66

原创 acwing-樱花(阶乘质因数分解)

题意:求不定方程1 / x+1 / y = 1 / n! 的正整数解的个数.转化为求 (n!) ^ 2 的约数个数推导过程(大佬讲的很清晰!)总结:在对于求多少个整数对(x,y)满足某方程式的问题时,可以先观察出 x、y与未知数的关系,然后转化成一个用 一个 x 表示的 y 的表达式,根据 y 的约束条件得到(x,y)的匹配数量。代码:#include<bits/stdc++.h>using namespace std;const int N = 1000010,m.

2021-08-24 17:13:24 154

原创 acwing-反素数

反素数反素数:对于x,所有比 x 小的正整数的约数个数都小于 x 的约数个数,那么 x 为反素数,题目求 1 - n 中的最大反素数。几个关键点:求1 - n 中拥有最多约数个数中最小的那一个。约数最多好理解,不是最多肯定不是最大反素数,而如果几个数都拥有这相同的最大约数个数,只有最小的那个数才是反素数,所以要最小。分解质因数的各质数之和一定小于等于31个。即使全分解成2,质数也会小于等于31。可分解的质数一定是从2开始连续的,且指数呈下降趋势。如果指数不连续或者不从2开始是可以调

2021-08-24 12:20:54 114

原创 GCD模板(求最大公约数)

int gcd(int a,int b){ return b ? gcd(b,a % b) : a;}也叫欧几里得算法或辗转相除法。证明:根据模板需要证明gcd(a,b) = gcd(b,a % b)有d是a的约数,d是b的约数,d是ax + by的约数。又有a mod b = a - (a / b(下取整) * b),设 c = a / b(下取整)所以需要证明:gcd(a,b) = gcd(b,a - (c * b))利用充分必要性证明:左到右:根据第一条定理,只要

2021-08-24 10:57:39 1548

原创 约数个数 约数之和

分别求n个数的乘积的所有约数个数以及和。有分解质因数公式,将每个数都分解质因数,用一个 map 来存每个质数的底数和指数。p1 的质数可以从零取到 a1, p2 可以取到 a2,以此类推,每个约数由 p1 到 pk 各选一个质数相乘得来,所以约数个数等于 (a1 + 1) * (a2 + 1) …(ak + 1).将约数之和的公式展开可以发现就是所有约数相加。求(p1 ^ 0 + p1 ^ 1 + p1 ^ 2 + … + p1 ^ a)的方法:设 t = 1,执行一次 t = p * .

2021-08-24 10:11:08 442

原创 试除法求约数

记得判断 x / i == i 的时候两个约数相同只要记录一个#include<bits/stdc++.h>using namespace std;const int N = 100010;void fun(int x){ int a[N],idx = 0; for(int i = 1; i <= x / i; i ++ ) { if(x % i == 0) { a[idx ++ ] = i;.

2021-08-24 09:33:42 57

原创 区间分组

今年暑假不AC区间分组指使得区间内不交叉的线段最多的分组方法。做法:用贪心的思维,将各区间按结束时间从小到大排序,只要不与前一个相交即可加入分组。代码:#include<bits/stdc++.h>using namespace std;const int N = 110;struct stu{ int l,r;} a[N];bool cmp(stu q,stu e){ return q.r < e.r;}int main(){

2021-08-24 09:05:44 341

原创 Week-1

一、最大异或和题意: 对一个长度为n的数组,求长度小于m的子数组的最大异或和。暴力双指针做法复杂度n2会超时。做法:对于区间和,先预处理出一个前缀异或和,所以题目转化为对数组找两个距离小于m的数使他们的异或值最大,就变成了加了限制条件的最大异或对这道题了。用01trie树做,对于限制条件,可以定义一个cnt数组表示树中每个节点被走过的次数,不在m的区间内的数,他们在树中走过的点cnt全部-1,复杂度 nlogn。关键点:找区间转化为找点、01trie树找最大异或对、用cnt数组处理限制条

2021-08-23 22:14:18 69

原创 几类区间覆盖

区间覆盖:给定区间,和n的线段,要求选择最少的线段使给定区间完全覆盖。做法:贪心,先根据左端点从小到大排序,先确定一个答案区间,然后在没有选择的线段中选择一个左端点在答案区间中,右端点最大的加入答案区间。poj-2376模板题,但这题是整数覆盖,所以有一个地方不同,具体见代码。#include<iostream>#include<algorithm>using namespace std;const int N = 25010;int n,t;struc

2021-08-23 11:05:58 428

原创 2021CCPC华为云挑战赛部分题解

1001、对象存储调度问题1001将 n 个大小为2的整数次幂的数放到 m 个一定空间的分条内,问能否放入。思路:首先可以用贪心的思想,把最大的数据往剩余空间最大的分条内放,将数据从大到小排序,再用一个堆来存放所有分条。由于数据都是2的整数次幂,所以用二进制的方法也是可以 ac 的。代码:#include<bits/stdc++.h>using namespace std;const int N = 100010;int t,n,m,a[N];int main(

2021-08-22 15:20:15 2131 3

原创 poj-1328(区间选点)

题目题目的意思就是给你一个坐标轴,雷达在x轴上,岛屿分布在x轴上方,给你岛屿的坐标以及雷达的最大扫描面积,求最少用几个雷达可以将所有的岛屿覆盖!以每个点为圆形,d为半径做圆,圆与x轴的两个交点分出一个区间,雷达在区间内可以辐射到该点,转化为每个区间内至少有一个雷达的区间选点问题。利用贪心的思想,将区间以右端点排序,从小到大循环,如果该区间没有雷达则在区间右端点安放雷达。证明可参考csdn#include<iostream>#include<cmath>#incl

2021-08-20 10:01:41 149

原创 三种筛质数方法

给定一个正整数 n ,请你求出 1∼n 中质数的个数。输入格式共一行,包含整数 n 。输出格式共一行,包含一个整数,表示 1∼n 中质数的个数。数据范围1≤n≤106输入样例:8输出样例:4一、朴素筛法对于每个数,筛掉他的所有倍数复杂度:2要筛n / 2 次,3要筛n / 3次,所以一共要筛n / 2 + n / 3 + …n / n,也就是 n * (1 / 2 + 1 / 3 + … + 1 / n)次,后面求和是调和级数,当 n 足够大时,等于lnn + c,

2021-08-19 17:01:04 4821 2

原创 试除法分解质因数

给定 n 个正整数 ai ,判定每个数是否是质数。输入格式第一行包含整数 n 。接下来 n 行,每行包含一个正整数 ai 。输出格式共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。数据范围1≤n≤100 ,1≤ai≤231−1输入样例:226输出样例:YesNo#include<bits/stdc++.h>//最差情况sqrt(n),最好情况(比如2的n次方)为lognusing

2021-08-19 16:39:59 63

原创 试除法判断质数

给定 n 个正整数 ai ,判定每个数是否是质数。输入格式第一行包含整数 n 。接下来 n 行,每行包含一个正整数 ai 。输出格式共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。数据范围1≤n≤100 ,1≤ai≤231−1输入样例:226输出样例:YesNo对要判断的数n,i 枚举2到sqrt(n),如果存在 n % i == 0,说明有因子不是质数,否则是质数。注意可以用 for(i

2021-08-19 16:34:51 143

原创 背包九讲

以下模板题目都可在acwing找到一、01背包问题之前有博客写过01背包和完全背包的详解:背包问题需要注意的就是01背包用的是上一层的 f 数组,所以对体积的循环是从大到小,而完全背包是从小到大。代码:#include<bits/stdc++.h>using namespace std;const int N = 1010;int n,m;int f[N],v[N],w[N];//int f[N][N],v[N],w[N];int main(){ .

2021-08-15 23:40:14 119

原创 floyd模板

复杂度:n ^ 3模板题:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定 k 个询问,每个询问包含两个整数 x 和 y ,表示查询从点 x 到点 y 的最短距离,如果路径不存在,则输出 impossible。数据保证图中不存在负权回路。输入格式第一行包含三个整数 n,m,k 。接下来 m 行,每行包含三个整数 x,y,z ,表示存在一条从点 x 到点 y 的有向边,边长为 z 。接下来 k 行,每行包含两个

2021-08-12 17:44:08 271

原创 spfa判负环

由于进入负权环会一直循环,所以spfa判断负环只需加一个cnt数组记录它连的边数,对于每个点,只要他的边数大于等于n即说明图中存在负环。由于负环不一定存在在由1出发的点的集合,所以一开始入队需要将所有点入队。还有一点在判断负环中可以不需要初始化d数组原因:有负环的话相当于某些点到起点的距离为负无穷,然后SPFA算法是正确的,且初始时这些点的距离为0,0大于负无穷,所以一定会把这些距离为负无穷的点不断更新。模板题:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可.

2021-08-12 17:38:41 220

原创 spfa算法模板

bellman-ford算法可以用来求带负权边的最短路,其中关键代码d[b] = min(d[b],backup[a] + w);,如果对于上一个循环,backup[a]未被更新,这一步也就不需要了。所以spfa是对bellman-ford算法的优化,思路是对于被更新了的点才进入队列。复杂度通常为 m ,但最坏时的复杂度仍然是 m * n模板题:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走.

2021-08-12 17:02:08 440

原创 bellman-ford算法模板

bellman-ford用于求带有负权边的最短路模型复杂度为:n * m图中不能带有负权回路,否则往前更新时进入回路会在回路中一直循环更新。模板题:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。注意:图中可能 存在负权回路 。输入格式第一行包含三个整数 n,m,k。接下来 m 行,每行包含三个整数 x,y,z,表示存在一条.

2021-08-12 16:01:07 163

原创 dijkstra求最短路Ⅱ(堆优化)

由于dijkstra算法是一个一个找离集合最近的点并进入集合,所以可以直接用一个单调队列来进行优化。复杂度:mlogm 一共m条边,单调队列里取元素复杂度为logm。一般来说稠密图边数 m 是 n ^ 2 级别稀疏图边数 m 是 n 级别所以当图为稠密图时效率不如邻接矩阵版的dijkstra,一般用于稀疏图。模板题:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 .

2021-08-12 15:30:33 190

原创 dijkstra算法Ⅰ模板(邻接矩阵)

dijkstra算法用于单源最短路的计算,给定一个 n 个点 m 条边有(无)向图,可以计算 1 到其他任意一点的最短路径。复杂度:(O n ^ 2,由于使用邻接矩阵存储,所以空间复杂度也为O(n ^ 2),一般用于稠密图的单元最短路。不能用于计算带负权边的图原因:模板题:给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1 。输入格式第一.

2021-08-12 15:03:18 524

原创 并查集

并查集一般包括两个操作:1:将两个集合合并2:询问两个元素是否在一个集合中按常规方法来做,一般是用个数组belong[x] = a,表示元素x在集合a中,执行操作一时要遍历整个数组所以复杂度为O(n),操作二直接判断复杂度O(1).而在并查集中,用树来储存元素,每棵树的根节点为集合编号,p[x]为x的父节点。执行操作一时,只需将某棵树的祖先结点接到另一棵树的祖先结点之下就行了.操作二判断两棵树的祖先结点是否相同即可,复杂度都为O(1).(寻找祖先结点本应该为logn,但在find函数中用了路.

2021-08-08 21:25:22 189

原创 KMP模板

输出主串s所有能够和字串匹配的第一个位置下标#include<bits/stdc++.h>using namespace std;const int N = 100010,M = 1000010;int ne[M],n,m;char s[M],p[N];int main(){ cin>>n>>p + 1>>m>>s + 1;//从下标1开始 for(int i = 2,j = 0; i <= n; i .

2021-08-08 17:15:35 69

原创 双链表操作

实现一个双链表,双链表初始为空,支持 5 种操作:在最左侧插入一个数;在最右侧插入一个数;将第 k 个插入的数删除;在第 k 个插入的数左侧插入一个数;在第 k 个插入的数右侧插入一个数现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个

2021-07-30 17:42:14 231

空空如也

空空如也

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

TA关注的人

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