算法
文章平均质量分 52
andyc_03
这个作者很懒,什么都没留下…
展开
-
【2022杭电多校3】2022“杭电杯”中国大学生算法设计超级联赛(3)
2022“杭电杯”中国大学生算法设计超级联赛(3)原创 2022-07-26 20:15:24 · 636 阅读 · 1 评论 -
【2022杭电多校1】2022“杭电杯”中国大学生算法设计超级联赛(1)
2022“杭电杯”中国大学生算法设计超级联赛(1)原创 2022-07-20 22:37:24 · 1925 阅读 · 2 评论 -
Codeforces Round #807 (Div. 2)
Codeforces Round #807 (Div. 2)简要题解原创 2022-07-18 21:03:46 · 264 阅读 · 0 评论 -
Codeforces Round #758 (Div.1 + Div. 2)
The problems were taken (mostly) from the ByteDance — Moscow Workshops Online Contest, which is happening at the same time. Tasks from the Online Contest are prepared by TadijaSebez and Bugman, additional tasks brought to you by Um_nik and gen. We are very原创 2021-12-12 22:56:26 · 662 阅读 · 0 评论 -
AGC056A - Three Cells per Row and Column
【题意】给定一个n*n的矩阵,请构造出一种黑白染色方式,使得每行每列均恰好有3个黑色,且总共的黑色连通块数是n【分析】这是一个不是很好想的构造方式,首先考虑n是3的整数倍的情况直接按照如下方式即可:当其不是3的倍数的时候,我们仍然模仿之前的方式,会得到如下的情况,但是这里存在连通块个数变多为n+2个的情况考虑如何解决这个问题,可以通过交换一些行的方式使得连成黑色的连成一个发现直接交换第一行和第$\floor{n/3}$行就可以减少一个,交换$n-\floor{n/3}+.原创 2021-12-12 14:49:39 · 711 阅读 · 1 评论 -
基环树笔记
基环树,又称环套树,最显著的特点就是有 N 个点 N 条边的连通图,也就是一个图上有一个唯一的环。多个基环树可以构成基环树森林,也是N个点N条边但不保证一定联通对于这种基环树我们主要有两种处理方式:1.先处理环上每个点支出来的子树部分,然后把贡献记录在环上的点,最后问题就成了计算一个环的答案了2.先删去环上的一条边,让基环树变成真正的树计算后考虑加上之前删去那条边的影响即可CF711D Directed Roads一个基础的计数问题,主要是计算环的边数P1453 城市环路原创 2021-07-04 16:29:03 · 244 阅读 · 0 评论 -
动态规划汇总
1.概率/期望dp一般题目中很明显会涉及到概率的字样,常用的方法有高斯消元......这是道十分有趣的结合了字符串的概率dp,要通过定义的方式转换为期望dp计算P6125 [JSOI2009]有趣的游戏这道是上一个的加强版,需要重新考虑dp的方式来减少无用的状态P3706 [SDOI2017]硬币游戏 ...原创 2021-07-01 22:49:29 · 94 阅读 · 1 评论 -
prufer序列
【算法简介】prufer序列就是,将一个带标号有根树和n-2个点值域在[1,n]的一个双射建立方式:每次选择一个编号最小的点删除,然后找到这棵树的叶节点标号最小的一个,在序列中记录下这个叶节点连接的那个点(父亲),重复n-2次即可我们用堆来保证在实现,很暴力的实现方式其实,我们有更好的线性构造方式构建一个指针p,初始把它直到最小的叶子节点然后循环进行一下操作:1.删除当前p指向的节点2.如果产生新的节点,设这个节点编号为x,如果x>p,不做其他操作;否则删除x.原创 2021-06-24 23:01:03 · 379 阅读 · 0 评论 -
网络流总结
【算法简介】网络流是个好东西主要掌握dinic的写法(最好是带上各种优化的)后,就是各种建图的套路了直接放个dinic的板子const ll inf=1e17;int head[maxn],tot=1,cur[maxn];struct edge{ int to,nxt; ll v;}e[maxm<<1];void add(int x,int y,ll z){ e[++tot].to=y; e[tot].nxt=head[x]; e[to.原创 2021-06-03 15:01:15 · 316 阅读 · 1 评论 -
burnside引理与Polya定理
【算法简介】【习题1】AT2143 [ARC062D] AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeersol.【习题2】POJ1286 Necklace of Beads【习题3】P4980 【模板】Pólya 定理sol.原创 2021-06-02 19:54:16 · 166 阅读 · 0 评论 -
拉格朗日插值
【算法简介】给定一些点值,更加快速的求出一个点对应的值基础的拉格朗日插值可以在的时间算出来一个点对应的值具体地,给定了点假设要求的点为,那么当x取值连续的时候,可以优化成先预处理出来 那么【例题】P4781 【模板】拉格朗日插值【代码】#include<bits/stdc++.h>using namespace std;#define mp make_pair#define fi first#define se s...原创 2021-05-28 15:43:30 · 503 阅读 · 0 评论 -
单位根反演
【算法简介】这个证明就讨论一下,然后等比数列求和就行【例题1】LOJ6485.LJJ 学二项式定理sol.原创 2021-05-28 10:07:42 · 73 阅读 · 0 评论 -
狄利克雷卷积
【算法简介】定义狄利克雷函数为(f∗g)(n)=∑d∣nf(d)g(nd)(f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})(f∗g)(n)=d∣n∑f(d)g(dn)性质:1.狄利克雷函数满足交换律,结合律2.ϵ\epsilonϵ为单位元,任何函数卷一下ϵ\epsilonϵ仍为本身ϵ(1)=1,ϵ(else)=0\epsilon(1)=1,\epsilon(else)=0ϵ(1)=1,ϵ(else)=03.积性函数f,和积性函数g的狄利克雷函数也是积性函数有以下常原创 2021-05-27 18:11:42 · 159 阅读 · 0 评论 -
矩阵树定理
【行列式】【性质】1.单位矩阵的行列式为12.交换两行要变号3.有两行一样的话行列式为0用上面的第二条,将这两行交换,加了符号实际上却未变,就是04.线性性5.用矩阵的一行加上另一行的倍数,行列式不变【求法】利用高斯消元的方式,再加上上面的性质加以辅助即可我们对于 A 进行消元,然后记录操作对于行列式的影响,最后得到上三角矩阵,行列式就是对角线乘积,如果消不出来那么返回 0最后再把影响逆回去即可【矩阵树定理】矩阵树定理是用来求一个无..原创 2021-05-27 10:23:39 · 643 阅读 · 0 评论 -
多项式全家桶
1.多项式求逆【代码】#include<bits/stdc++.h>using namespace std;#define mp make_pair#define fi first#define se second#define lson now<<1#define rson now<<1|1typedef long long ll;const int mod=998244353;const int maxn=8e5+5;int a[原创 2021-05-26 10:32:05 · 152 阅读 · 0 评论 -
生成函数
【算法简介】.生成函数计数的分析过程有两步 : 将问题用生成函数刻画,再利用处理幂级数的技巧得到答案。这是贯穿全文的一条重要原则。生成函数计数的困难正来源于这两步之中。 生成函数自身结构非常强大,能很好地刻画并适应浩如烟海的各色组合问题。但在某些特殊问题中则显得笨拙多余,如杨表等精心构造的组合结构。 我们得到了生成函数后,可能需要非常复杂的技巧来处理它。在某些问题中通过组合手段处理却相对容易。(或者说简洁的组合手段可能蕴含复杂的代数分析) 【例题】...原创 2021-05-26 08:08:05 · 186 阅读 · 1 评论 -
FFT
【算法简介】FFT主要用于处理多项式乘法的问题,时间复杂度可以优化到O(NlogN)整体思路是把两个多项式转换为点值表达,然后用O(N)进行乘法这个问题的瓶颈就在于如何用更快的方式转换为点值这里就要引入傅里叶的方法了:我们取一些特殊的点计算点值,也就是把复数的单位圆平均分成n分的值带入然后我们再针对这个进行加速,也就是快速傅里叶变换这样我们就可以证明在N*logN的复杂度进行一些操作继续优化:把数组分到最后的位置,我们可以发现一些规律如果一个点位置..原创 2021-05-24 19:52:05 · 199 阅读 · 0 评论 -
斯坦纳树
【算法简介】斯坦纳树一般用于解决这样一类问题,一个无向图,k个关键点,每个边有边权,求联通这k个点的最小代价最小生成树可以认为是斯坦纳树的特殊情况由于k个关键点的要求精确覆盖,只能用状压,所以k一般最多到10,n也不会太大方法:设F[i][s]表示以i为根的子树内,选择的关键点状态为s的最小代价外层枚举状态S然后考虑转移:1.由自己的其他状态转移来F[i][s]=min{F[i][t]+F[i][s^t]}2.由其他边走过来F[i][s]=min{F[i][s],F[j.原创 2021-05-24 08:53:47 · 1883 阅读 · 0 评论 -
仙人掌问题(圆方树)
【算法简介】仙人掌就是把树上多连了一些返祖边,构成了一些环根据仙人掌这个名字我们也可以较为形象的感受到图的形态具体的,仙人掌分为点仙人掌和边仙人掌,定义分别为点/边最多属于一个环之所以把这样的图形单独拿出来处理,就是因为它和树较为类似,有一些好的性质(相较一般图)我们常用的处理办法是建立圆方树后,把原图转换为一个树进行计算圆方树建立方法:我们称原来图上的点为圆点,对于一个点双,我们把这个环上的边断开,新建立一个方点,把这个点双内所有的圆形点与方点相连,这样就构成了一个..原创 2021-05-24 08:46:12 · 568 阅读 · 0 评论 -
虚树
【算法简介】虚树就是对于一个n个节点的树T,我构造出一个新的树T'使得其节点数最少,包含指定的一些节点(关键点)和它们的lca一般出现关键点的数目较少且有较多次询问时,我们就要利用到虚树了【构造方法】对于整棵树预处理lca和dfs序,利用增量算法构造对于一个询问涉及到了k个关键点,我们按照dfs序依次加入建立虚树时我们需要开一个栈st[],用于记录原路径上按照之前加入的询问点要加入虚树的那些点,按照深度从小到大储存每次加入一个节点x,计算出x,st[top]的lca,如果这.原创 2021-05-21 09:00:16 · 153 阅读 · 0 评论 -
树套树
1.原创 2021-04-22 13:42:47 · 96 阅读 · 0 评论 -
Kruskal重构树
【算法简介】算法流程和Kruskal生成树类似,把边排序后,依据并查集加边即可,两个点认一个新的节点父亲,这个点的点权就是当前边权所以我们最后得到了一个有2n-1个节点的带点权的树 sort(e+1,e+m+1,cmp); for(int i=1;i<=n*2;i++) fa[i]=i; cnt=n; for(int i=1;i<=m;i++) { int fx=find(e[i].u),fy=find(e[i].v); if(fx!=fy) { fa[f原创 2021-04-22 13:39:32 · 113 阅读 · 0 评论 -
左偏树(可合并堆)
【算法简介】顾名思义,这个数据结构向左偏,而且主要的性质是可以合并,而且是一个有序的堆定义外界点是有一个儿子是空的的节点,每个点的dis定义为到最近的外节点经过的边的数量我们让每个节点的左儿子的dis>=右儿子的dis,然后操作尽量从右侧开始,通过这种方式来保证其优秀的时间效率合并操作就是每次让右侧儿子和另一棵树进行合并,合并的过程中注意满足有序的性质,还有左偏的性质就行还有一个删除操作,左偏树不支持删除某个值得点的操作,只能删除某个已知位置的点,一般常用的操作是删除根节点【例原创 2021-04-22 13:23:51 · 277 阅读 · 0 评论 -
主席树
主席树全称是可持久化权值线段树,主要解决区间第k大问题注意空间大小为NlogN,一般可以开到N<<51.P4587 [FJOI2016]神秘数【题意】给定一个数列,求最小的不能被l-r集合中的数表示的值【分析】这个题目有一个很好的思想,类似于货币?如果当前已经表示出1-pos,集合中最大的为mx,那么新加入的一个值一定在[mx+1,pos+1]才对结果又影响,如果小于mx+1,那么和以前一样,如果大于pos+1,中间有断开的位置,所以答案还是不会变,所以我们的问题变成了求.原创 2021-04-21 23:51:36 · 236 阅读 · 0 评论 -
线段树
1.扫描线【例题】【POJ1151】Atlantis【题意】矩形面积求并【分析】这是扫描线最基础的操作了,首先我们离散化,然后把矩形的上下边拆开存储,记录每个边是上边还是下边(读到上底加上这个长度,下底就减去)想象一个平行于x轴的直线向上移,每次统计在扫描线上的线段长度,用长度乘以这段宽度用线段树+1(底)/ -1(顶)去维护每段是否在当前的矩形内,计算它们的长度和即可【代码】#include<iostream>#include<cstdio>#in原创 2021-04-20 23:39:12 · 374 阅读 · 0 评论 -
网络流24题——P1251餐巾计划问题
考虑到每天的干净餐巾和脏的餐巾是不同的,所以我们需要把每一天拆成两个点来处理,记作上午和下午想到这里问题就简单了建图:源点向上午连(inf,p) 表示新买 //源点向下午连(ri,0) 表示提供 //上午到汇点连(ri,0) 来限制每天必须达到ri的最大流 //i天下午到i+1天下午建 (inf,0) 表示剩余 //i天下午向i+m天上午建(inf,f) 表示快洗 //i天下午向i+n天上午建(inf,s) 表示慢洗 //然后就是最小费用最大流代码...原创 2021-03-16 23:56:48 · 120 阅读 · 0 评论 -
2021——线段树与树状数组
1.二维线段树 poj1195Mobile phonesTime Limit: 5000MS Memory Limit: 65536K Total Submissions: 25374 Accepted: 11565 DescriptionSuppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area..原创 2021-01-27 00:32:29 · 126 阅读 · 0 评论 -
Codeforces Round #697 (Div. 3)
A求一个数是否有奇因子一直除以二即可代码#include<bits/stdc++.h>using namespace std;int main(){// freopen("a.in","r",stdin);// freopen("a.out","w",stdout); int t; scanf("%d",&t); while(t--) { long long n; scanf("%lld",&n); while(n%..原创 2021-01-26 12:43:17 · 119 阅读 · 0 评论 -
2021——概率dp
1.POJ3744 Scout YYF I 输入n表示共有n个地雷(0<n<=10),并且输入每个地雷所在的位置ai(ai为不大于10^8的正整数)。 现在求从1号位置出发越过所有地雷的概率。用两种行走方式:①走一步 ②走两步(不会踩爆中间那个雷)。这两个行为的概率分别为p和(1-p)。我们首先考虑每个点要跨过地雷,一定是在地雷前一步的位置走了一个两步的方案,所以我们将每个块的概率相乘,这样问题就是成为了计算到每个地雷前一个点的概率这个就可以用到概率dp进行计算...原创 2021-01-23 18:47:27 · 258 阅读 · 0 评论 -
Codeforces Round #696 (Div. 2)
A这道题目是很明显的贪心,因为位数多的数字一定更大,所以我们可以记录前一位数字,通过当前位置的配对,尽量保证和上一位不同代码#include<bits/stdc++.h>using namespace std;int n;int main(){// freopen("a.in","r",stdin);// freopen("a.out","w",stdout); int t;scanf("%d",&t); while(t--) {..原创 2021-01-22 13:13:42 · 78 阅读 · 0 评论 -
计蒜客2019.12提高组月赛
T1 排列这道题目考察的主要是贪心的构造方法,唯一的难点就在于奇数的特殊处理代码#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;int a[maxn],qs[maxn],qb[maxn];int ans[maxn],ps,pb,ca,cb;int main(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout..原创 2021-01-18 13:18:15 · 108 阅读 · 0 评论 -
2021——AC自动机
1.P5357 【模板】AC自动机(二次加强版)一道被我误作模板的不是模板的题目就是一个AC自动机+树上差分 链接2.HDU2825 Wireless Password这是一道典型的AC自动机+计数类dp的问题需要AC自动机+状压dp 链接3.P2414 [NOI2011] 阿狸的打字机...原创 2021-01-18 11:40:29 · 124 阅读 · 0 评论 -
【AC自动机/二维哈希】UVA11019 Matrix Matcher
这道题目首先想到的就是二维hash!那就先写一发代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1005;const int b1=19260817;const int b2=233;char s1[maxn][maxn],s2[maxn][maxn];ll h1[maxn][maxn],h2[maxn][maxn],p1[maxn*maxn],...原创 2021-01-18 11:38:28 · 137 阅读 · 0 评论 -
【AC自动机】P2414 [NOI2011] 阿狸的打字机
比方说下面的这个Trie树,蓝色的箭头指向的就是其fail指针指向的节点。我们不妨转换一下思路,对于每个x串,只有能通过fail指针指向它的末尾节点的y串节点才能计数。那么我们不妨把fail指针反向,构建一棵fail树。由于在一颗树中,一个节点及其子树在DFS序中是连续的一段,那么我们可以用一个树状数组来维护x串末尾节点及其子树上有多少个属于y串的节点。那么我们可以得到一个离线算法:对fail树遍历一遍,得到一个DFS序,再维护一个树状数组,对原Trie树进行遍历...原创 2021-01-18 00:20:26 · 139 阅读 · 0 评论 -
【AC自动机+状压dp】HDU2825 Wireless Password
题意 :输入n(1<=n<=25)、m(0<=m<=10)、k,意思就是给你 m 个模式串,问你构建长度为 n 至少包含 k 个模式串的方案有多少种 mod20090717直接进行计数一定是比较麻烦的,又发现m比较小,所以我们可以进行一下状态压缩再继续进行计算记dp[i][k][s]为长度为i,在AC自动机上j位,拥有的模式串集合为s的方案数此外AC自动机上每个点还有处理出来一个当前包含哪些模式串的集合这个dp还要滚动一下数组,要不然会T!!代码...原创 2021-01-16 23:29:14 · 90 阅读 · 0 评论 -
P5357 【模板】AC自动机(二次加强版)
AC自动机模板复习:1.建立模式串组成的Trie树 2.连fail边摘自 ouuan的博客原创 2021-01-16 22:42:56 · 117 阅读 · 1 评论 -
【数位dp】P4999 烦人的数学作业
数位dp的基础题,复习模板用!!代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=1e9+7;ll f[20][200],a[20];ll dfs(int x,int sum,int top){ if(!x) return sum; if(!top && f[x][sum]>=0) return f[x][sum]; i...原创 2021-01-14 00:18:47 · 138 阅读 · 1 评论 -
2021——二分图匹配
1.最小点覆盖=最大匹配eg.1 poj1325 Machine Schedule题意:有两个机器A和B,A机器有n个模式,B机器有m个模式,两个机器最初在0模式。有k个作业,每个作业有三个参数i,a,b,其中i代表作业编号,a和b代表第i作业要么在A机器的a模式下完成或在B机器的b模式下完成,问两个机器总共最少变换多少次可以完成所有作业我们将两台机器的每个模式作为一个顶点,如果作业作业需要机器A的x模式和机器B的y模式,就将x-y相连,然后用最少的顶点覆盖所有的边即可代码..原创 2021-01-08 20:25:30 · 186 阅读 · 0 评论 -
2021——网络流例题
1.hdu3987 Harry Potter and the Forbidden Forest这道题目有双向边和单向边,破坏一条边的代价为Wi,求破坏的总代价最小的情况下,最少要破坏几条道路,使得城市0无法到达城市n-1就是求0-(n-1)的最小割这道题目有两个小技巧:1.双向建边,不用建立四个,反向边就不用额外建立了2.要保证一个变量a最小的情况下,使得另一个变量尽可能小,我们给a乘上一个权值X,这样每条边表示为,a的值为,b的值为还能保证在求最大流的时候,还是以a为第一优先.原创 2021-01-06 23:16:40 · 200 阅读 · 0 评论 -
2021——网络流初步
首先是一些概念,容量,流量,饱和弧,非饱和弧,零弧,非零弧,增广路,残量,残量网络1.Edmonds—Karp算法这个方法的时间复杂度比较差 为原创 2021-01-06 18:29:46 · 215 阅读 · 0 评论