![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
~~~
xiyuping24
所求皆如愿,所行化坦途
展开
-
多次查询最大子段和
【代码】多次查询最大子段和。原创 2022-10-17 16:29:39 · 187 阅读 · 0 评论 -
P6113 【模板】一般图最大匹配
由于出现奇环意味着有两条路走着走着碰上了,现在我们就是要找到这个相遇的点(记为花根)。找到花根后,我们继续处理环。用pre[v]数组记录环,一步步跳环的过程我们将整个花都染成了同一个颜色,那么此时这个花就可以当成一个该颜色的点来处理了(缩点,修改祖先操作用并查集维护即可)花指的是对于一个有2*k+1个点的奇环,其内部最多有k个匹配,还有一个点与环外一点匹配,我们把这样一个环缩为点,形成的点就叫花。然而,匈牙利只能处理二分图——这是因为二分图是保证没有奇环的,一旦遇上奇环匈牙利直接进死循环,所以本题算法。原创 2022-10-11 14:45:03 · 145 阅读 · 0 评论 -
次小生成树
【代码】次小生成树。原创 2022-09-23 22:53:45 · 120 阅读 · 0 评论 -
【算法】浅谈 k 短路问题的三种解法 -bosh
这篇文章的前两个 Solution 是我一年多前写的,第三个 Solution 当时不会,因此拖到 19 年才写出来。转载 2022-09-23 21:13:52 · 332 阅读 · 0 评论 -
决策单调性优化
1.每一段的左右端点的贝壳大小一定相等,且这一段选定的贝壳一定是左右端点的贝壳大小2.跟据第一点写出状态转移方程3.根据第一点也可以知道,状态转移只在相同的颜色之间转移。原创 2022-07-29 20:44:45 · 220 阅读 · 0 评论 -
高斯消元——重载运算符的运用
被重载运算符摁在地上摩擦qwq。转载 2022-07-28 08:42:22 · 61 阅读 · 0 评论 -
计数与期望
n-2)指减去一个中间的最大值与一个重复值,2^(n-3)指在把数字分别放到最大数两边,此时已经有3个数字(最大值、两个相同的数——一左一右)确定下来。呃其实挺苟的在正常处理卡特兰的时候还要处理取模,题目没有保证模是质数,我们采用分解质因数(快速幂)来处理(逆元都没法用qwq)。正常插板法只适用于正整数解,两个板不能插到一个空里,为了解决这个问题我们在方程左右同时加上k,得到答案C(n+k-1,k-1);这里我们用到的是第二个式子当统计钦定的m个幸运数的倍数的个数时,每一个数会被统计。...原创 2022-07-26 16:23:27 · 211 阅读 · 0 评论 -
数论【qwq】
ex_eulur(费马小定理的一般情况)快速(龟速)乘——防爆高精。原创 2022-07-26 00:09:15 · 111 阅读 · 0 评论 -
不熟练的模版集合
固定终点最长路原创 2022-06-23 19:56:43 · 74 阅读 · 0 评论 -
分块+莫队
分块的思想大家应该都不陌生,作为线段树或者树状数组的简化版本,分块主要用于解决......之类的区间操作。分块1区间加法+区间比某个数小的数有多少个再写的时候有一点坑,就是再求和的时候习惯于long long,但是因为经常出现要当下标的指针,所以就总是把long long形当作下标了,本地会报错。区间加法+区间求和以上是分块的一些基础操作,接下来就可以去搞莫队了来自莫队算法 --算法竞赛专题解析(26)莫队是一个神奇的算法,先来一道例题:P1972 HH的项链题......原创 2022-06-08 20:15:44 · 157 阅读 · 0 评论 -
二进制状压DP基操
1.查询第 i 位上数字是否为1:x&(1<<(i-1))!=02.将第 i 位上数字修改为1:x=x|(1<<(i-1))3.将第 i 位上数字修改为0:x=x&~(1<<(i-1));P1879 [USACO06NOV]Corn Fields G#include<bits/stdc++.h>using namespace std;const int mod=1e8;int n,m,a[20],q[1<&l..原创 2022-05-06 07:03:42 · 96 阅读 · 0 评论 -
ybtoj强连通分量专题
tarjan缩点+三道例题原创 2022-04-29 21:13:47 · 446 阅读 · 0 评论 -
矩阵快速幂板子
#include<bits/stdc++.h>using namespace std;const int N=1010,mod=1e9+7;long long a[N][N],ans[N][N],temp[N][N],n,k;void calculate(){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { temp[i][j]=ans[i][j]; ans[i][j]=0; } for(int i=1;i&l.原创 2022-04-27 23:29:31 · 76 阅读 · 0 评论 -
乘法逆元模板
乘法逆元 - zjp_shadow - 博客园老实说我压根没看明白度娘说的乘法逆元是什么,OI Wiki里也没有找到基础解释(好在B站yyds)先说逆元是个什么东西,他大概是对一种操作进行逆运算,就像反函数一样。乘法逆元虽然叫乘法,但是是用来解决除法的取模运算的。但是除法他就不行。所以乘法逆元要做的事情就是把对 a/b 取模这件事转化出对 a 做什么,对 b 做什么,然后再结合起来还能保证效果一样。我们的想法是把 1/b 转化成 b 的负一次方。当 ax≡1(mod p),则称 x原创 2022-04-24 23:34:47 · 587 阅读 · 0 评论 -
#6280. 数列分块入门 4
数列分块入门 4#include<bits/stdc++.h>using namespace std;#define int long longconst int N=100010;int n,t,ans;int a[N],pos[N],add[N],L[N],R[N],sum[N];void change(int l,int r,int c){ int p=pos[l],q=pos[r]; if(p==q) { for(int i=l; i<=r; i++)原创 2022-04-20 20:54:59 · 319 阅读 · 0 评论 -
#6279. 数列分块入门 3
数列分块入门 3#include<bits/stdc++.h>using namespace std;#define ll long longconst int N=1000010;ll n,num,sq;ll a[N],b[N],tag[N],q[N],lll[N],rrr[N];void order(int x){ for(int i=lll[q[x]];i<=rrr[q[x]];i++) b[i]=a[i]; sort(b+lll[q[x]],b+rrr[q[原创 2022-04-20 15:07:15 · 295 阅读 · 0 评论 -
分块模板[]
分块思想就是把区间操作尽可能的变成一些标记,只要每个块内的操作可以用一样的东西来表示就可以用分块https://loj.ac/p/6277#include<bits/stdc++.h>using namespace std;int n,a[50010];int q[50010],tag[50010],length;void change(int l,int r,int x){ for(int i=l;i<=min(r,q[l]*length);i++) a[i]+=.原创 2022-04-17 13:02:05 · 393 阅读 · 0 评论 -
分块初学笔记
守墓人注意#include<bits/stdc++.h>using namespace std;#define ll long longll q[200010],a[200010],sum[200010],sigma[200010];ll n,f,length;ll min(ll a,ll b){return a<b?a:b;}void change(int l,int r,int k){ for(int i=l;i<=min(r,q[l]*length).原创 2022-04-15 23:56:41 · 275 阅读 · 0 评论 -
工程规划——差分约束
工程规划,一道标准的差分约束,数据给出方式就是两个点之间的价值小于某个常数。(以下部分内容学习自原创 2022-04-05 22:59:14 · 385 阅读 · 0 评论 -
字符串算法
Manacher详解原创 2022-03-12 23:11:52 · 196 阅读 · 0 评论 -
最长路(拓扑)板子
最长路#include<bits/stdc++.h>using namespace std;int n,m,cnt;struct edge{int u,v,w;}e[100010];queue<int>q;int head[100010],mx[100010],ru[100010];void add_edge(int u,int v,int w){ e[++cnt].u=head[u];//next e[cnt].v=v;//to head[u]=cnt;.原创 2022-03-04 23:16:06 · 206 阅读 · 0 评论 -
关于分组背包循环顺序
一开始看分组背包的时候以为是指不同组间相互冲突,想用并查集,但是看见标程后发现是指同组间相互冲突。因此循环顺序先容量后物品下标是因为:如果反过来,每组物品间会产生重合(积累),类似于多重背包。那么如果真的是不同组之间冲突呢?我想先预处理每一组会有哪些冲突,建成保证所有不冲突者在一起的新组,然后正常DP...原创 2022-03-04 22:37:55 · 167 阅读 · 0 评论 -
搜索的优化技巧
关于搜索,计算时间复杂度是一件很闹心的事。最常见的优化技巧是剪枝(卡常),通常可以剪的地方有:已经不可行,继续搜下去一定不可能 该方案不可行,没有必要继续本次处理但是除了剪枝以外,还有许多优化方式一、记忆化搜索二、双向搜索三、启发式搜索四、...原创 2022-02-20 22:56:22 · 700 阅读 · 0 评论 -
动规思路大赏
T1数字三角形f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];//其中i自下向上,因为上受下影响T2过河卒if((i!=1||j!=1)&&!vis[i][j]) step[i][j]=step[i-1][j]+step[i][j-1];T3最长公共子序列(太坑了!!!1e5的范围,一开始是按n2做的,连MLE带TLE了4遍!!!)...原创 2022-02-09 22:36:00 · 54 阅读 · 0 评论 -
并查集板子
int find(int x) { if(f[x]==x)return x; return f[x]=find(f[x]);}//查找void merge(int x,int y){ x=find(x); y=find(y); if(x!=y)f[x]=y;}//合并 通常放在int main()里原创 2022-02-10 13:44:00 · 50 阅读 · 0 评论 -
广搜
cell:类似迷宫比较怪的地方在于循环放在主程序里(确实是bfs太长了导致)跟深搜有什么区别呢?点击查看代码#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#include<strin...原创 2022-01-27 23:14:00 · 67 阅读 · 0 评论 -
树状数组
【模板】树状数组 1 【模板】树状数组 2 前置芝士电脑存数时用二进制(废话),正常环境下int占4字节,一字节含8比特位,数据范围在-2147483648 ~2147483648 之间,加上unsigned不管负数就可以开到4294967296,long long 更狠,开到-9223372036854775807~9223372036854775807树状数组这玩意儿给我留下最...原创 2022-02-13 12:43:00 · 47 阅读 · 0 评论 -
RMQ+ST表
在求区间最值,区间最大公约数时ST表时很好的选择。ST表其实就是二分求值,但是分区间可能重叠,所以不能处理重叠对答案有影响的问题(区间求和等)#include<bits/stdc++.h>using namespace std;int n,m,Log[2000010],f[2000010][21],a[2000010];int main(){ Log[0]=-1; s...原创 2022-02-13 13:06:00 · 84 阅读 · 0 评论 -
关于SPFA
关于SPFA:它死了但它总是诈尸原创 2022-02-18 23:53:00 · 54 阅读 · 0 评论 -
最短路径
floyd是一种动态规划算法,稠密图效果最佳,边权可正可负他的原理在于用邻接矩阵存任意两点之间的最短路径,适用于多源最短路,点与点之间:自己到自己——dis=0;自己到别人——找一mid,随机二分,就一区间DP//k为中间点 for(k = 0; k < G.vexnum; k++)//v为起点 for(v = 0 ; v < G.vexnum; v++)...原创 2022-02-10 21:55:00 · 63 阅读 · 0 评论 -
十年OI一场空,不开long long见祖宗
//线段树:单点修改+区间求和#include<bits/stdc++.h>#define ll unsigned long longusing namespace std;ll n,m,a[1000010],ans[2000010],tag[2000010];ll ls(ll x) { return x<<1; }ll rs(ll x) { return x...原创 2022-02-14 17:37:00 · 1063 阅读 · 0 评论 -
拓扑排序——有向无环图中的线性序列
搜出一个入度为 0 的点推出该点并删除其所有边一直循环直至图空了或者找不到入度为 0 的点(有环)拓扑排序通常用来“排序”具有依赖关系的任务。...原创 2022-02-11 15:26:00 · 197 阅读 · 0 评论 -
tarjan2
反过来调过去,我还是感觉没学明白缩点讲一个有向图中的所有强连通分量缩成一个点后,构成的新图是一个DAG。一个点所在的强连通分量一定被该点所在DFS搜索树所包含树上的边大致分为:树枝边,前向边(从上往下指),后向边(从下往上指),横叉变。其中前向边肉眼可见地没什么卵用接下来开始算法流程。tarjan的精髓如上次所说,在于DFS搜索树,在DFS搜索树中强连通分量以怎样形式存在是关键问...原创 2022-02-15 20:23:00 · 124 阅读 · 0 评论 -
LCA
int LCA(int x,int y){ if(dep[x]<dep[y]) swap(x,y); for(int i=20;i>=0;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i]; if(x==y) return x; for(int i=20;i>=0;i--) { if(f[x][i]!=f[y][i]) {...原创 2022-02-12 08:36:00 · 300 阅读 · 0 评论 -
欧拉回路
欧拉回路用于处理图中从某一点是否能不重复边地走到另一点。考虑第 i 个点入度为 n ,那么因为边不可重复,出度也一定为 n (起点终点除外)。实现的过程可以模拟删边 (摘自Marsrayd 的题解)#include <bits/stdc++.h>using namespace std;const int MAX=100010;int n,m,u,v,del[...原创 2022-02-11 08:02:00 · 157 阅读 · 0 评论 -
tarjan——有向图、无向图
强连通块只存在于有向无环图DAG中实际上low[i]的理解是:一个强连通块在dfs搜索树中子树的根节点//把一个点当成根提溜出来,抖搂抖搂成一棵树 void dfs(int u){//记录dfs序//可通过任意多dfs边与最多一条非树返祖边到达的、本强连通分量内最小点 dfn[u]=low[u]=++dfs_clock; s.push(u); for(int v:g[u])...原创 2022-02-11 15:10:00 · 141 阅读 · 0 评论 -
线段树
单点修改+区间求和考虑用lazy数组标记,当我们需要对点k所对应的区间加v时,我们不递归k的左右子树更新其内部值,而是选择lazy[k]+=v,代表这段区间已经加过v了。当我们在查询和修改中遇到一个有懒标记的点k时,由于其子树内部的值还未被更新,我们需要将懒标记的影响下传到子树中,并将懒标记清空。#include<bits/stdc++.h>#define ll unsigne...原创 2022-02-17 07:49:00 · 55 阅读 · 0 评论 -
素数性质3
好吧我承认是我大意了在写完素数性质2之后我觉得已经很好了,但我爸提出了一个迷之疑问:你怎么保证每一条螺旋中有数量近似相等的素数???一开始我查到的是素数相关统计,按照十进制的习惯,列出10的同余类并进行相关统计——于是我们得到无数以 {1,3,7,9} 结尾的素数并且四者分布平均。以此类推,如果采用性质优异的710同余类,应当具有类似的性质。于是我看见了一个更神奇的东西——狄利克雷定理。虽然...原创 2021-11-26 18:02:00 · 138 阅读 · 0 评论 -
素数筛1
1.朴素for(int i=1; i*i <= n; i++) if(n % i == 0) return 0; return 12.埃氏筛 筛掉大部分数的倍数,从x*x开始点击查看代码void prime(int n){ memset(v,0,sizeof(v)); for(int i=2; i<=n; i++) { if(v[i])是素数; for(in...原创 2021-11-16 21:52:00 · 1129 阅读 · 0 评论 -
神奇小证明之——世界上只有5个正多面体+构造x3=2a3
今天我彻底放飞自我了。。。作业还没写完。。。但就是要总结一些好玩的小性质。。。谁给我的勇气呢?原创 2021-11-25 18:02:00 · 102 阅读 · 0 评论