摘要:
Priority_queue用法模板 一、无需重载运算符 小根堆 #include<bits/stdc++.h> using namespace std; priority_queue<int,vector<int>,greater<int> >q; int main() { for(int i=1 阅读全文
posted @ 2020-10-23 21:01
林生。
阅读(134)
评论(0)
推荐(0)
摘要:
八月月赛 P6745 Number #include<bits/stdc++.h> using namespace std; #define ll long long ll k,x,a[555]; int main() { scanf("%lld %lld",&k,&x); a[k+1]+=1; w 阅读全文
posted @ 2020-10-23 20:59
林生。
阅读(60)
评论(0)
推荐(0)
摘要:
显著特征 按顺序填入$1$到$i$的数组$a$,给定一个对应顺序$s$,新的数组$b$满足$b[i]=a[s[i]]$。(然后将新的b数组当成a数组,进行下一次相同的操作) 实质为:给定一个数n,将n拆分为$n=x1+x2+x3+···xp$,求有关$lcm(x1,x2,x3,···,xp)$的问题 阅读全文
posted @ 2020-10-23 20:56
林生。
阅读(435)
评论(0)
推荐(0)
摘要:
启发式合并 即:玄学合并 P3012 梦幻布丁 #include<bits/stdc++.h> using namespace std; const int N=1e5+5,M=1e6+5; int n,m,ans,a[N],st[M],f[M],pre[M],tail[M],siz[M]; voi 阅读全文
posted @ 2020-10-23 20:48
林生。
阅读(93)
评论(0)
推荐(0)
摘要:
CDQ分治 思想 分治,二分进行计算。将区间左半部分作为已知,右半部分作为查询进行计算。 陌上花开(三维偏序) 关键思想:按abc关键字进行排序,再以b为关键字进行归并排序。 因为先按a排序:每次归并时都一定有右区间的a大于等于左区间的a。 因为先按abc进行排序,故不会出现{1,1,3}{1,1, 阅读全文
posted @ 2020-10-23 20:44
林生。
阅读(103)
评论(0)
推荐(0)
摘要:
#include<bits/stdc++.h> using namespace std; string s; int i,j,k; int main() { cin>>s; int len=s.length(); s+=s; i=0;j=1; while(i<len&&j<len) { for(k= 阅读全文
posted @ 2020-10-23 20:42
林生。
阅读(44)
评论(0)
推荐(0)
摘要:
KMP 两个单整串相互匹配。 #include<bits/stdc++.h> using namespace std; const int N=1e3+5; string s1,s2; int nxt[N],ans,len1,len2; int main() { cin>>s1>>s2; len1= 阅读全文
posted @ 2020-10-23 20:41
林生。
阅读(112)
评论(0)
推荐(0)
摘要:
RMQ问题 单调队列 单调队列 #include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,m,a[N],q[N]; int main() { scanf("%d %d",&n,&m); for(int i=1;i<=n 阅读全文
posted @ 2020-10-23 20:39
林生。
阅读(120)
评论(0)
推荐(0)
摘要:
Tarjan 模板 void tarjan(int u,int fa) { //最初能到达的dfn最小的点为其本身 dfn[u]=low[u]=++tdfn; for(int i=tail[u];i;i=e[i].pre) { int v=e[i].v; //如果这个点还没到达,就走一走 if(!d 阅读全文
posted @ 2020-10-23 20:35
林生。
阅读(168)
评论(0)
推荐(0)
摘要:
一些小tip 快读 读入速度快于scanf,远快于cin。 模板。 ch=getchar()写在while的条件里时耗时会增加。 int read(){ int x=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch= 阅读全文
posted @ 2020-10-23 20:34
林生。
阅读(75)
评论(0)
推荐(0)
摘要:
二分图 没有网络流不能做的二分图!(不是) 二分图最大匹配模板 最小点权覆盖也是如此。 #include<bits/stdc++.h> using namespace std; const int N=505; int n,m,e,ans,bp[N],cnt[N]; bool d[N][N],vis 阅读全文
posted @ 2020-10-23 20:33
林生。
阅读(81)
评论(0)
推荐(0)
摘要:
网络流 一、基本概念 1、流 A、网络流问题 给定指定的一个有向图,其中有两个特殊的点:源S,汇T。 每条边有指定的容量,求满足条件的从S到T的最大流。 通俗解释:汇T为你家,源S为自来水厂,边即自来水厂和你家之间修的水管子,容量即水管子容量,有的大有的小。自来水厂开闸放水,问你家收到的水最大流量是 阅读全文
posted @ 2020-10-23 20:31
林生。
阅读(458)
评论(0)
推荐(0)
摘要:
Tarjan算法与无向图连通性 缩点 int tdfn,c[N],dfn[N],low[N],tak[N]; bool ins[N]; void tarjan(int u) { dfn[u]=low[u]=++tdfn; tak[++tak[0]]=u; ins[u]=1;//在栈里 for(int 阅读全文
posted @ 2020-10-23 20:11
林生。
阅读(136)
评论(0)
推荐(0)
摘要:
差分约束问题 区间 给定 n 个区间$ [ai,bi]$和 $n \(个整数\) ci$。 你需要构造一个整数集合 Z,使得∀i∈[1,n],Z 中满足ai≤x≤bi的整数 x 不少于 ci 个。 求这样的整数集合 Z 最少包含多少个数。 输入格式 第一行包含整数 n。 接下来n行,每行包含三个整数 阅读全文
posted @ 2020-10-23 20:10
林生。
阅读(113)
评论(0)
推荐(0)
摘要:
负环 SPFA:检查cnt[u]是否大于n-1 DFS/BFS:可更新的点是否已经到过 阅读全文
posted @ 2020-10-23 20:08
林生。
阅读(85)
评论(0)
推荐(0)
摘要:
次小生成树 给定一张N个点M条边的图,在其生成的所有树中权值大小仅次于最小生成树的树被称为次小生成树。 结合模板题进行讲解。 次小生成树 给定一张 N 个点 M 条边的无向图,求无向图的严格次小生成树。 设最小生成树的边权之和为sum,严格次小生成树就是指边权之和大于sum的生成树中最小的一个。 输 阅读全文
posted @ 2020-10-23 20:06
林生。
阅读(90)
评论(0)
推荐(0)
摘要:
树上差分 引理:差分序列的前缀和是原序列。 原数列 9 4 7 5 9 前缀和 9 13 20 25 34 差分数组 9 -5 3 -2 4 前缀和的差分数组 9 4 7 5 9 差分数组的前缀和 9 4 7 5 9 树上差分即将区间操作转化为路径操作。 点差分 边差分 闇の連鎖 传说中的暗之连锁被 阅读全文
posted @ 2020-10-23 20:04
林生。
阅读(101)
评论(0)
推荐(0)
摘要:
最近公共祖先_LCA 给定一棵有根树,若节点z即可以到x也可以到y,则称z为xy的公共祖先,公共祖先中深度最大(即距离x,y最近)的则是xy最近公共祖先,称为LCA(x,y)。 以洛谷的**P3379【模板】最近公共祖先(LCA)**进行讲解: 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直 阅读全文
posted @ 2020-10-23 20:01
林生。
阅读(156)
评论(0)
推荐(0)
摘要:
树的直径 树中最远的两个节点之间的距离或者路径被称为树的直径。 树的直径一般有两种写法,时间复杂度都为O(n)。 树形DP 以1号节点为根,d[x]表示从x节点出发可达的最远距离,f[x]表示过x节点的最长路径长度。 对于每个x,扫描到x的第i个子树,d[x]储存了从x到1~i-1的子树的点的最远距 阅读全文
posted @ 2020-10-23 20:00
林生。
阅读(217)
评论(0)
推荐(0)
摘要:
最小生成树 Kruskal算法O(mlogm) 按边扫描,选边加入树,使每个子树都最小,一边加边一边合并,最后得到整棵树。 1.建立并查集,每个点个字构成一个集合。 2.将所有边按照w大小排序,依次扫描每条边(u,v,w)。 3.如果u,v属于同一集合(即相连,存在长度更小的使u和v相连的边),则跳 阅读全文
posted @ 2020-10-23 19:49
林生。
阅读(143)
评论(0)
推荐(0)
摘要:
最短路 单源最短路径 Dijkstra算法O(mlogn) 每次找到离出发点距离最近的且未被使用过的点,用此点去更新其他点。 1.初始化$dis[1]=0$,其余节点dis值为正无穷。 2.找出一个未被标记的,dis[u]最小的节点x,然后标记节点u。 3.扫描节点u的所有出边(u,v,w),若$d 阅读全文
posted @ 2020-10-23 19:46
林生。
阅读(100)
评论(0)
推荐(0)
摘要:
遍历所有边 看牛 给定N个点M条边的无向图,求一条路径,从节点1出发,最后回到节点1,并且满足每条边恰好被沿着正、反两个方向分别经过一次。 若有多种方案,输出任意一种即可。 输入格式 第一行包含两个整数N和M。 接下来M行每行包含两个整数a和b,表示点a和点b之间存在一条边。 输出格式 共2M+1行 阅读全文
posted @ 2020-10-23 19:45
林生。
阅读(317)
评论(0)
推荐(0)
摘要:
BFS能解决的问题图论都能解决,但BFS能跑的图必须有每条边权值相同的特质。 电路维修 #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 105 阅读全文
posted @ 2020-10-23 19:43
林生。
阅读(175)
评论(0)
推荐(0)
摘要:
折半搜索 假设每一位都要k种情况,则直接搜索的复杂度为$O(N$k\()\),折半搜索复杂度为$O(2*N$k/2\()\)。 #include<bits/stdc++.h> #define N 44 #define int long long using namespace std; int n, 阅读全文
posted @ 2020-10-23 19:39
林生。
阅读(113)
评论(0)
推荐(0)
摘要:
斜率优化 2020.10.8,具有纪念意义的一天,我学会斜率优化了!!感谢学长!!! 附上学长超高质量非常好懂的斜率优化讲解。 X严格递增,K严格递增。 P3195 [HNOI2008]玩具装箱 #include<bits/stdc++.h> using namespace std; #define 阅读全文
posted @ 2020-10-23 19:37
林生。
阅读(88)
评论(0)
推荐(0)
摘要:
数位DP #include<bits/stdc++.h> using namespace std; #define int long long const int N=20; int a,b,s[N],ten[N],dp[N][N][2][2]; /* 记录状态为 走到第p位,目前答案是多少 还有多 阅读全文
posted @ 2020-10-23 19:35
林生。
阅读(72)
评论(0)
推荐(0)
摘要:
队列优化DP 围栏 有N块木板从左到右排成一行,有M个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。 第 i 个木匠要么不粉刷,要么粉刷包含木板 Si 的,长度不超过 Li 的连续的一段木板,每粉刷一块可以得到 Pi 的报酬。 不同工匠的Si不同。 请问如何安排能使工匠们获得的总报酬最多。 输入格 阅读全文
posted @ 2020-10-23 19:33
林生。
阅读(62)
评论(0)
推荐(0)
摘要:
倍增压缩DP 开车旅行(TLE13/20) 小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 HiHi。 城市 i 和城市 j 之间的距离 d[i,j] 恰好是这两个城市海拔高度之差的绝对值 阅读全文
posted @ 2020-10-23 19:32
林生。
阅读(118)
评论(0)
推荐(0)
摘要:
状态压缩DP 蒙德里安的梦想 求把N*M的棋盘分割成若干个1x2的的长方形,有多少种方案。 例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。 如下图所示: 2411_1.jpg 输入格式 输入包含多组测试用例。 每组测试用例占一行,包含两个整数N和M。 当输入用例N=0,M= 阅读全文
posted @ 2020-10-23 19:31
林生。
阅读(68)
评论(0)
推荐(0)
摘要:
环形与后效性处理 休息时间(强行断开+强行相连) 在某个星球上,一天由 N 个小时构成,我们称0点到1点为第1个小时、1点到2点为第2个小时,以此类推。 在第 i 个小时睡觉能够恢复Ui点体力。 在这个星球上住着一头牛,它每天要休息B个小时。 它休息的这B个小时不一定连续,可以分成若干段,但是在每段 阅读全文
posted @ 2020-10-23 19:30
林生。
阅读(186)
评论(0)
推荐(0)
摘要:
树形DP 没有上司的舞会 Ural大学有N名职员,编号为1~N。 他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。 每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。 现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。 在满足这个条件的前提下,主办方希望邀请一 阅读全文
posted @ 2020-10-23 19:28
林生。
阅读(120)
评论(0)
推荐(0)
摘要:
区间DP 划分区间,区间长度从1~m。 for(int len=1;len<=m;++len) for(int i=1;i<=n-len+1;++i) { int j=i+len-1; 转移方程 } 石子合并 设有N堆石子排成一排,其编号为1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来 阅读全文
posted @ 2020-10-23 19:26
林生。
阅读(105)
评论(0)
推荐(0)
摘要:
背包问题 0/1背包 给定n个物品,其中第i个物品体积为vi,价值为wi。有一容积为w的背包,放一些物品入背包,使物品的总体积不超过w,且价值最大 \(f[i][j]=max(f[i-1][j],f[i-1,j-vi]+wi【if(j>=vi)】)\) 数字组合 给定N个正整数A1,A2,…,AN, 阅读全文
posted @ 2020-10-23 19:25
林生。
阅读(245)
评论(0)
推荐(0)
摘要:
线性DP 最长上升子序列 输入一个长度为n的数组,求该数组的最长上升子序列(模板)复杂度$O(n^2)$ #include<bits/stdc++.h> using namespace std; #define N 100005 int n,m,a[N],f[N]; int main() { sca 阅读全文
posted @ 2020-10-23 19:21
林生。
阅读(117)
评论(0)
推荐(0)
摘要:
普通二叉树与平衡树初步 无旋Treap,Treap,Splay 见题库-网课-Treap和Splay。 普通平衡树 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入数值x。 删除数值x(若有多个相同的数,应只删除一个)。 查询数值x的排名(若有多个相同的数,应输出最 阅读全文
posted @ 2020-10-23 19:15
林生。
阅读(74)
评论(0)
推荐(0)
摘要:
点分治 树 给定一个有N个点(编号0,1,…,N-1)的树,每条边都有一个权值(不超过1000)。 树上两个节点x与y之间的路径长度就是路径上各条边的权值之和。 求长度不超过K的路径有多少条。 输入格式 输入包含多组测试用例。 每组测试用例的第一行包含两个整数N和K。 接下来N-1行,每行包含三个整 阅读全文
posted @ 2020-10-23 19:13
林生。
阅读(60)
评论(0)
推荐(0)
摘要:
分块 将数组分为N½块,算出每块对应的满足条件的值,在暴力的基础上提升效率。 蒲公英 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关。 为了简化起见,我们把所有的蒲公英看成一个长度为 n 的序列a1,a2,…,ana1,a2,…,an,其中aiai为一个正整数,表示第 i 棵蒲公英的 阅读全文
posted @ 2020-10-23 19:10
林生。
阅读(146)
评论(0)
推荐(0)
摘要:
主席树 1.普通主席树 静态区间查询第k大的数。 对于一个长度为n数组,数值离散化之后范围为1~\(s[0]\),则开n棵范围s[0]棵线段树,每次查询l,r区间时,取出树r和树l-1进行计算,树r-树l-1得到的就是树l-r的值。 但由于每个点开一个线段树内存消耗很大,同时易知每棵树和前一棵树相比 阅读全文
posted @ 2020-10-23 19:02
林生。
阅读(70)
评论(0)
推荐(0)
摘要:
线段树 即对数组进行二分保存。 由图易得,除去最后一层,树的深度为$log$2\(N\),则树的大小约为$N2$≤20+21+22+……+2log2N/2<\(N*4\),但在一些特殊的图上,可能会大于$N4$,所以一般而言,线段树数组开到N*8的大小。 主要操作 1.单点修改 注意左右节点和父节 阅读全文
posted @ 2020-10-23 18:56
林生。
阅读(108)
评论(0)
推荐(0)
摘要:
树状数组 树状数组即利用二进制进行储存,若x的最低位1在第i位,则x储存x-2i~x的数值,可利用二进制进行快速修改与查询。 树状数组便于快速查询前缀和,查询和修改的复杂度皆为$O(log2N)$,而普通前缀和查询的复杂度为$O(1)$,但修改的复杂度为$O(N)$,效率太低。 一维树状数组 修改函 阅读全文
posted @ 2020-10-23 17:48
林生。
阅读(139)
评论(0)
推荐(0)
摘要:
并查集 将满足某一条件的值加入同一集合 int x=find(u),y=find(v); f[x]=v; 查找函数 void find(int x) { return f[x]!=x?f[x]=find(f[x]):x; } 普通并查集 银河英雄传说 有一个划分为N列的星际战场,各列依次编号为1,2 阅读全文
posted @ 2020-10-23 17:40
林生。
阅读(100)
评论(0)
推荐(0)
摘要:
搜索的本质是模拟。 ###P1092 虫食算 #include<bits/stdc++.h> using namespace std; const int N=30; string ss; int n,val[N],s[4][N]; bool use[N]; void dfs(int x,int y 阅读全文
posted @ 2020-10-23 17:38
林生。
阅读(113)
评论(0)
推荐(0)

浙公网安备 33010602011771号