算法竞赛——进阶指南
#
夕林山寸
这个作者很懒,什么都没留下…
展开
-
网络流——最大流 dinic 算法模板 P3376 【模板】网络最大流
dinic复杂度最坏为O(n^2 * m)先构造分层图。然后一次性找出多条增广路更新。重复上述步骤即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 5000+7;const int N = 200+7;int head[N],cnt=1;void init(){cnt=1,memset(head,0,sizeof(head));}struct EDGE原创 2020-07-12 20:44:37 · 220 阅读 · 0 评论 -
网络流——最大流 EK算法模板 P3376 【模板】网络最大流
复杂度最坏:O(n*m^2) 因为最多会找n*m次增广路#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 5000+7;const int N = 200+7;int head[N],cnt=1;void init(){cnt=1,memset(head,0,sizeof(head));}struct EDGE{int to,nxt;ll w;}ee[M*2];vo.原创 2020-07-12 20:18:10 · 136 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 368. 银河 SCC+差分约束+spfa 一道不错的综合题
从题面上看,很容易想到是差分约束。但是发现数据范围比较大,无法判断无解情况(复杂度为O(nm)).但我们仔细读题,发现:边权只有0/1。由于是求每个未知量得最小值。我们建一个超级源点S,d[S]=0,d[x] - d[S] = 1;这样就能保证每颗星星得最小值为1.然后把条件按最长路建图。(为什么是最长路,可以仔细想一下,我之前差分约束总结里有详细说)由于是最长路,无解的情况是存在正环,而由于只有0/1,所以某个环上只要有一个1,那么就无解。也就是说,我们可以在建图时先判断是否有原创 2020-07-11 09:25:49 · 330 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 367. 学校网络 SCC - tarjan求强连通+思维
先把强连通缩点变成一个新图。(强连通内的点相互可达)显然:新图中零入度的点无法被其他点到达,所以必须放置一个软件。而把所有0入度点放置软件后,其他点总有前置点,即总可达。所以第一问的结果为0入度点的个数。第二问证明:这个证明总结的很好。https://www.acwing.com/solution/content/4663/#include<bits/stdc++.h>using namespace std;typedef long long ll;.原创 2020-07-08 18:31:41 · 270 阅读 · 0 评论 -
[模板] scc/强连通分量
类比无向图连通分量。low[x],dfn[x]#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 1e5+7;const int N = 1e5+7;int head[N],原创 2020-07-08 16:22:28 · 223 阅读 · 0 评论 -
hdu2894// 算法竞赛——进阶指南——acwing 400. 太鼓达人 欧拉回路经典题 //欧拉回路的建模小结
无向图的欧拉回路:1.图连通;2.图所有点度数均为偶数;//欧拉路径要求起点和终点度数为奇数;有向图的欧拉回路:1.图连通;2.图所有点入度等于出度;//欧拉路径要求起点入度=出度-1,终点入度=出度+1;欧拉回路:通过图中每条边一次且仅一次,并且过每一顶点的回路。关键词是:每条边仅经过一次。也就是说如果一道题建图后,要求一条回路(路径),每条边经过且仅经过一次。回到这道题:显然长度为2^k。网上看到的题解只有这个讲的是正确的。https://b.原创 2020-07-04 19:17:38 · 250 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing399. 约翰的旅行 欧拉回路+最小字典序边 打印
只要弄懂欧拉回路的原理,即dfs找回路。就能轻松的写出这题。题目要求字典序最小。那么我们就无法让head[x]=i,加速找欧拉回路的过程。老老实实的0(n*m)的算法遍历最小边权即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst d.原创 2020-07-03 21:00:00 · 222 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing366. 看牛 欧拉回路
这题要求每条边正反各被走一次,求一条路径。每条边正反各走一次的话,对度数就没有要求了,即任意图都可构造出一条题意路径。打印过程类似欧拉回路的过程,dfs时记录经过点数。不过这里vis标记只标记访问的单向边。/*必须满足所有度数都为偶数有且仅有2个度数为奇数时,存在欧拉路径*/#include<bits/stdc++.h>using namespace std;const int M =2e5+7;int head[M],cnt;struct EDGE{int to原创 2020-07-03 19:17:32 · 183 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing365. 圆桌骑士 v-DCC+二分图染色+思维
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 1e6+7;const int N = 1e3 +7;int head[2*M],cnt=1;struct EDGE{i...原创 2020-07-03 15:43:07 · 327 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 364. 网络 e-DCC + LCA + 并查集 O(M+logn*Q)做法
之前我们暴力枚举路径上的边每次要ON的复杂度太慢了。考虑我们每次找路径是找自底向上找,,很多次会找到非桥边,造成不必要的浪费步数。所以我们可以用并查集来压缩路径。若点x与其父亲的路径从桥边变成非桥边,则把x指向y的祖宗。这样就能跳过非桥边进行无意义的访问了。单次复杂度将为logn#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 4e5+7;int hea原创 2020-06-30 19:03:41 · 236 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 364. 网络 e-DCC + LCA O(M+NQ)做法
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 4e5+7;int head[M],cnt=1,head_c[M],cnt_c=1;struct EDGE{int to,...原创 2020-06-30 18:07:25 · 2694 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 362. 区间 差分约束经典题目 好题 (差分约束总结)
差分约束存在性问题很简单,spfa判环即可。难点在于求某个变量的最大值,或者某两个变量差的最大/最小值。求某个变量的最大值我们可以转化为后者。即令x0=0 , xi-x0<=0 / xi-x0>=0;先说下结论:求变量差最大值,变成小于等于号,建图求最短路。求变量差最小值,变成大于等于号,建图求最长路。当然你可以强行给变量差加个符号,使得一定取最大/最小,使用最短路/最长路。给出若干个不等式,求 xi - xj 这个变量的最大值。其中有一个不等式:...原创 2020-06-24 12:48:50 · 233 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 361. 观光奶牛 spfa判存在性负环+01分数规划
求和a/求和b 很像01分数规划。二分结果L。构造出若存在一个环满足上述式子等价于存在一组解,使得 式子大于L,即L小于最终结果 l=mid,否则r=mid。上述构造是因为找负环可以直接用spfa进行处理。#include <bits/stdc++.h>using namespace std;typedef long double ld;#define ls (o<<1)#define rs (o<<1|1)#define pb p..原创 2020-06-22 22:31:31 · 207 阅读 · 0 评论 -
算法竞赛——进阶指南——acwng359. 创世纪 基环树+树形背包dp +环形dp
一个元素选,则限制其的元素必须至少一个不选。所以我们把元素指向限制其的元素。建出图。假如是棵树,则用树形dp即可。(类比经典树形dp舞池问题)但这是一颗基环树(即最多一个环,因为每个点有且只有一个入边,且是n个点,n条边)先找到每个联通块的唯一环。然后把环断开,当成一棵树进行树形dp。再考虑断开环的影响:比如断开x->y, 影响是:缺少了一条边x->y, 即x选,y不选的情况。那么我们让y固定不选,则x就可以选,且y其他儿子可任意选或不选。加个flag标记判断跑2..原创 2020-06-19 22:40:28 · 384 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 358. 岛屿 基环树求直径
由于每个点都要连一个边。最终图会分成若干个联通块,每个联通块n个点,n条边。即是一个基环树。求出每个联通块中任意两点距离最大值(即基环树的直径)求和即可。一般基环树的问题围绕环来处理。先把环看出一个点,就能转化为树上问题。基环树的直径分两类:(把环当成根节点)1.不在环上,在环的某个节点的子树中。2.经过环上2点x,y。并延申至x,y所在子树。即dis(x,y)+D[x]+D[y] .D[x]为dp求直径时维护的,x到其子树中点的最远距离。我们先求出基环树的环 :s1,s2.原创 2020-06-18 17:17:20 · 675 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 357. 疫情控制 二分+树上倍增+思维+贪心
一道树上难题!首先:时间肯定越长越好,我们可以二分转化为判规定时间是否可行从而简化问题。然后我们发现,一个节点肯定越靠近根节点其管辖的节点越多,也越优。在规定时间内,所有节点尽量往根节点靠近。执行完靠近后出现两类军队:1:停在根节点的儿子节点。2:停在非 根节点的儿子节点。第1类军队涉及到是否移动到根节点再移动到某个根节点的儿子节点。我们把根节点的儿子节点的集合设为S。先不考虑第一类节点移动的问题。只考虑第二类军队。dfs判断只用第二类节点是否能控制住根节点的某些儿子原创 2020-06-17 22:46:11 · 249 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 356. 次小生成树 kruskal + 倍增 +最值 lca
实现比较考验码力的一道题。思路比较简单:先建立出一颗MST,求出边权和ans,然后枚举非MST的边(x-y边权为w),与MST构成的环,求出换上最大边权mx,次大边权mc。若mx!=w,则次小生成树可能为:ans-mx+w;否则,次小生成树可能为:ans-mc+w;注意这里次大是严格次大。其实就是相当于求MST上 x-y路径中边权最大与次大值。可以类比距离求lca。 用倍增维护。然后就是经典合并最大次大。可以分类讨论或者直接开一个小数组sort。具体实现看代码。这原创 2020-06-17 15:37:14 · 228 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing355. 异象石 dfn的性质+lca (简单的小证明)
比较难的一道题。题意是求连接标记点所需最小的边集。相当于求一个边集,恰好经过这些点,且边集最小。我们把这些标记点按dfn序(即dfs序)排列,发现相邻两个点的距离和(加上首末两点的距离和)刚好是上述边集的二倍。这个性质不好证,但容易观察得到。dfn本来就是按照dfs的遍历顺序的。下面简单证明一下:假设T是这些点的公共lca.那么边集一定进过T点。所以我们把T标记不会影响边集结果。易知:T点的dfn序一定是最小的。这些点按dfn序排序后,T在首位。然后我们以T为起点,按原创 2020-06-17 12:07:22 · 438 阅读 · 0 评论 -
算法竞赛——进阶指南 —— acwing354. 天天爱跑步 思维+树上差分+树上子树和减法应用
一道比较综合的树上差分题,比较考验思维。显然等差数列不好直接维护。先考虑什么情况下会观察到玩家:对于一条路径s-t对于上升路径s->lca(s,t),上的任意一点x:当:d[s]-d[x]=w[x] 时,这个人会被点x的观察员观察到。这样的话,对于每个点x,我们考虑所有人的起点s,当d[s]=w[x]+d[x]时,这个学生能被x观察到。这样就转化为了树上差分。(对于剩下的链 t -> lca(s,t) ,同理)对于一个人的路径中:s->lca(s,t)上的点原创 2020-06-10 12:51:39 · 344 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing342. 道路与航线 dijkstra+拓扑排序+缩点
这题有负权,不能直接用dij。但是这题图的性质很特殊:双向边权值都为正。单向边连接不会回头,即不成环。//暗示你可以拓扑单向边可以拓扑,双向边可以dij。那么我们综合一下即可。考虑一个图,先连接双向边,划分若干联通快,标号。然后把联通块缩成点,再加入单向边。此时图是一个无环图,可以拓扑排序,按照拓扑序进行dis三角式的转移:即 s到y的距离,与s到x再到y的距离比较。按照拓扑序,对每个缩点内部进行dij算法,其连出的联通快度数减一,方便拓扑序的进行。这样依次进行每个.原创 2020-05-13 22:50:12 · 212 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing342. 道路与航线 spfa写法(slf优化)
spfa+双端队列的小优化,能卡过。。。。以后遇事不决莽spfa再说。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 1e5+7;int head[M],cnt;voi原创 2020-05-13 18:24:57 · 240 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing376. 机器任务 0/1要素,问题转化为二分图模型 二分图最小点覆盖
关于二分图最小点覆盖的模型:1:每条边2个端点2:每条边至少选择一个端点。这一题:这里注意0连的边不能加。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e3+7;int head[M],cnt;void init(){cnt=0,memset(...原创 2020-05-07 23:04:26 · 170 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing374. 导弹防御塔 巧妙转二分图多重匹配
二分时间。固定时间后,每个防御塔发射炮弹数量是固定的。每枚炮弹可打的敌人也是固定的。相当于一个多重匹配,左部图一个可匹配多个,有部图一个只能匹配一个。把左部图拆成多个点,进行最大匹配。#include <bits/stdc++.h>using namespace std;typedef long double ld;typedef long long ...原创 2020-05-07 18:52:12 · 184 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing373. 車的放置 二分图模型 匈牙利算法
根据上一篇博客里的二分图模型:01要素。这一题我们可以这样构建:把每行当成一个点,每列当成一个点,行列分成2个集合。1.行之间,列之间不会连边。2.每行只会与一个列相连,表示 i行j列这个位置放一个车。由于车会打一行一列,所以这行这列都不能再放车了。上述满足二分图模型。求最大匹配则可以直接套匈牙利算法即可。#include <bits/stdc++.h>u...原创 2020-05-06 10:50:23 · 175 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing372. 棋盘覆盖 匈牙利算法的模型 0要素/1要素
这类问题可以转化为二分图求最大匹配:1.节点能分成2个独立的集合,每个集合内部有0条边2.每个节点只能与1条匹配边相连。这一题显然满足以上2个要素。1:把棋盘分成黑白相间的两个集合,相邻的一黑一白连边表示放一个骨牌,显然同黑同白不会连边2:由于骨牌不会重叠,所以每个点只会有一个匹配边。然后求最大匹配。直接匈牙利算法即可解决。注意一些小细节:最多2e4条边。因为每个点...原创 2020-05-06 10:41:18 · 165 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 219. 剪纸游戏 SG函数 稍微变形
这题1*1是胜利。SG有向图游戏要求不可取时必败。我们观察可知:2,2 2,3 3,2 必败。每次切一刀变成2个子游戏,异或起来即可。然后就是求SG函数经典套路,mex一下。#include <cstdio>#include<iostream>#include<algorithm>#include<cstring>...原创 2020-04-19 21:53:25 · 242 阅读 · 0 评论 -
Dropping tests POJ - 2976 0/1分数规划
0/1分数规划:给定n个a,n个b。求一组解xi(1<=i<=n,xi==0或1)使下式最大化:我们不妨假设存在一个解使得上式等于L。那么:考虑这个式子如果这个式子大于0,那么就有:L比实际值要小(可能L就是解)如果这个式子小于0,有:L比实际值要大(此时L不可能是解)综上 二分即可。这一题不过是加了个只选n-k个的条件而已#inc...原创 2020-04-18 18:43:23 · 158 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing213. 古代猪文 lucas定理+欧拉定理+中国剩余定理,巧妙的性质!
一道很考验数论基本功的题目,知识杂糅。首先指数取模一般用欧拉定理降维(利用指数循环节)而这必须满足q与mod互质,由于mod是质数,当q==mod时,结果为0,否则q与mod互质则可用欧拉定理的推论得到:然后只需处理质数部分即可。大数的组合数用lucas定理求。但由于求多次,且模数太大,阶乘的复杂度过高,不可直接求。我们分解999911659发现:其有4个质因子...原创 2020-04-14 19:37:59 · 262 阅读 · 1 评论 -
算法竞赛——进阶指南——acwing211. 计算系数
组合数高中知识搞搞就行#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M ...原创 2020-04-13 12:00:35 · 161 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing210. 异或运算 第K小异或
经典问题,手敲一遍#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = ...原创 2020-04-09 15:40:11 · 191 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing209. 装备购买 高斯消元求矩阵秩
注意eps不能设太小,否则精度不够,这题明显求矩阵秩。高斯消元求一下即可。注意碰到某一列全0的情况,跳过即可,行数不要+1#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#defin...原创 2020-04-03 18:35:22 · 159 阅读 · 0 评论 -
算法竞赛——进阶指南——POJ1830 异或方程组求解—— (解答为何这道题 的 异或方程组组可以高斯消元)
搞了半天才明白为什么异或方程组求解可以直接套高斯消元。。看了往上bolg几乎都没有提这点。。(我感觉这地方才是最难的)其实异或方程组求解直接套高斯消元是有条件的:未知数必须是2的次幂(0,1,2,4,这种)只有这样才满足 a*x ^ b*x == (a ^ b ) * x ;这样两个方程就可以异或消去未知数了。...原创 2020-03-17 18:42:52 · 399 阅读 · 1 评论 -
算法竞赛——进阶指南——acwing207. 球形空间产生器 高斯消元应用
n维球体的通式:(x1-a1)^2 +(x2-a2)^2 + …… +(xn-an)^2 =R ^ 2球心坐标就是(a1,a2,……,an)给出n+1个坐标,均带入,发现不好解,因为是二次方程,而且R^2是未知数由于所有方程右边都是R^2 我们可以两两联立方程,消去一次 变成多元一次方程 用高斯消元搞搞就行。例如:(x11-a1)^2 +(x12-a2)^2 + ...原创 2020-03-13 17:46:13 · 157 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing206. 石头游戏 矩阵快速幂 经典题:构造转移矩阵,描述转移状态
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_back//#define a(i,j) a[(i)*(m+2)+(j)] //m是矩阵的列数con...原创 2020-03-09 17:26:35 · 324 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing205. 斐波那契 矩阵快速幂
利用了矩阵结合律,先算出构造递推矩阵自乘的结果,再与初始矩阵相乘。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_back//#define a(i,j) a[...原创 2020-03-06 10:51:03 · 1516 阅读 · 0 评论 -
NOIP2012 同余方程
中国剩余定理,模数不互质的情况。用数学归纳法两两式子解。先用扩展欧几里得求出第一个方程的x通解。然后与第二个联立,求出再第一个方程同解的集合内的情况下,x的通解。(注意要判是否有解)以此类推。注意防止整数溢出。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ...原创 2020-03-01 18:21:59 · 290 阅读 · 1 评论 -
算法竞赛——进阶指南——acwing203. 同余方程 拓欧模板题
拓欧模板题。利用裴属定理解决二元一次方程。ax+by=m 有解 充要条件是 m|gcd(a,b);#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb p...原创 2020-02-25 16:58:10 · 239 阅读 · 0 评论 -
算法竞赛——进阶指南——POJ3696 acwing202. 最幸运的数字 欧拉函数 指数循环节
https://www.bbsmax.com/A/x9J2xWyKd6/思路参考蓝书和这篇博客。这里的qmul的意思是快速乘法,为了防止快速幂中两个1e10相乘爆LL。然后我把sqrt(2e9)内质数预处理出来,加快速度#include <bits/stdc++.h>using namespace std;typedef long long ll;#define...原创 2020-02-21 19:46:24 · 195 阅读 · 0 评论 -
算法竞赛——进阶指南——POJ3090 acwing201. 可见的点 欧拉筛写法
主要利用了欧拉函数的性质,https://blog.csdn.net/bjfu170203101/article/details/104404928我这篇博客里的性质 3) 和 4)。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1...原创 2020-02-20 16:50:42 · 222 阅读 · 0 评论 -
算法竞赛——进阶指南——POJ3090 acwing201. 可见的点
1:埃筛写法 复杂度nlogn#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_back//#define a(i,j) a[(i)*(m+2)+(j)] ...原创 2020-02-20 10:01:28 · 212 阅读 · 0 评论