
I like for you to be still
I like for you to be still
我不叫细胞大液泡了
技能树点满
展开
-
Dijkstra朴素+堆优化
Dijkstra(迪杰斯特拉)算法用来解决单源最短路问题,即给定图G和起点s,通过算法得到s到其他每个点的最短距离。算法思想是贪心。核心思路是:创建一个集合S(初始为空),每次找到距离点s最近且不在集合S中的点u,将该点加入到S,访问该点的所有出边点v,判断是否可以通过点u为中介点,使点v到s的距离更近,如果可以则优化d[v]。朴素代码:复杂度:O(n2):O(n^2):O(n2)#inc...原创 2019-09-05 17:17:05 · 192 阅读 · 0 评论 -
最大匹配问题——匈牙利算法
二分图指,具有L,R两个点集合,每个集合内没有连边,集合之间的点有连边。二分图最大匹配问题是指,找到一个确定边最多。即选择的边最多,且任何两边都没有公共点。若两个集合内的点都被匹配上,成为完美匹配。这类问题可以用网络流,但是匈牙利算法更加简洁。这就是一个二分图模型,设左边深蓝色的点为L集,右边粉红色的点为R集合,黑色的边为可连边。(1):找L1的首可连边,再找L2的首可连边,这两个R集的...原创 2019-09-04 21:34:27 · 421 阅读 · 0 评论 -
中国剩余定理
给出以下一元线性同余方程组:中国剩余定理条件说明:若整数:m1m_1m1,m2m_2m2,…,mnm_nmn两两互质,则对任意整数:a1a_1a1,a2a_2a2,…,ana_nan,方程(S)(S)(S)有解。通解通过下面的构造得到:设M=m1∗m2∗...∗mnM=m_1*m_2*...*m_nM=m1∗m2∗...∗mn,并且...原创 2019-09-01 22:22:01 · 143 阅读 · 0 评论 -
逆元
简单得求余概念:(a+b)%p=(a%p+b%p)%p(a+b)\%p=(a\%p+b\%p)\%p(a+b)%p=(a%p+b%p)%p(a−b)%p=(a%p−b%p+p)%p>0(a-b)\%p=(a\%p-b\%p+p)\%p>0(a−b)%p=(a%p−b%p+p)%p>0(a∗b)%p=(a%p∗b%p)%p(a*b)\%p=(a\%p*b\%...原创 2019-08-29 18:36:24 · 275 阅读 · 0 评论 -
扩展欧几里得详解
给出a、b、c,,给出a∗x+b∗y=ca*x+b*y=ca∗x+b∗y=c中,x、y满足一定条件的解。这时我们就要用到扩展都几里德了。首先要知道一个性质:若a∗x+b∗y=ca*x+b*y=ca∗x+b∗y=c有解,则有c=k∗gcd(a,b),k∈Zc=k*gcd(a,b),k∈Zc=k∗gcd(a,b),k∈Z,这一点可以利用唯一分解定理证得。利用上面的性质,我们将等式两边同除于kkk...原创 2019-08-29 00:33:48 · 539 阅读 · 0 评论 -
KMP模板
#include<bits/stdc++.h>const int maxn = 1e6 + 10;char mo[maxn], str[maxn];///mo为模式串、str为主串int next[maxn];inline void GetNext(){ int i = 0, j = -1, len = strlen(mo); next[i] = j; ...转载 2019-08-26 16:52:37 · 95 阅读 · 0 评论 -
初学---莫比乌斯反演
莫比乌斯反演是数论数学中很重要的内容,可以用于解决很多组合数学的问题。1.莫比乌斯函数u(d)有如下定义:有如下性质:莫比乌斯打表int mu[N+5];vector<int> prim;bool flag[N+5]={false};void Mobius(){ mu[1]=1; for(int i=2;i<N;i++)...原创 2019-09-04 21:40:50 · 193 阅读 · 0 评论 -
DFS序-树链剖序-欧拉序
,二叉树是一颗线段树,树状数组,树上的每个维护节点负责维护一个区间信息,节点之间又包含和属于的关系。例如线段树:DFS序:我们通过对每个节点设置两个量,in和out。从根节点开始DFS搜索,in为第一次搜索到时的时间戳,out为退出出栈时的时间戳。可以得到,例如我们要查询以b为根节点我们只需要查询区间[2,5];要查询以c为根节点子树的信息,我们可以查询区间[6,7];查...原创 2019-08-12 00:16:00 · 219 阅读 · 0 评论 -
线段树---区间修改
区间增值思路:为每个节点引入一个懒标记,例如在[1,8]区间内,更新[3,5],更新时只需将5节点([3,4]),12节点([5]),标记并更新,以及他们的父节点更新。当查询到一个被标记的区间,若查询区间完全包含它时只需下放标记,更新本节点的值,然后退出(因为懒嘛,不直接访问不更新)。若更新一个区间的过程中,若已存在一个标记,下放这个标记,直到子区间上有标记而父区间没有(其实没有这部操作也...原创 2019-09-04 21:40:16 · 175 阅读 · 0 评论 -
线段树---单点修改
思路:线段树,每个节点都被模拟成一条线段,负责维护这条线段(下面成为区间)从从左端点到有端点这一部分的信息。大致思路是这样的:一个父节点负责维护一块大区间的信息,他有两个左右子节点,编号为分别负责维护父节点的左一半区间和右一半区间。这个图是维护区间最大值的线段树.数据结构:根节点编号为1。编号为rt的节点,维护区间是[l,r];左儿子编号为rt*2,维护[l,(r+l)/2];...原创 2019-09-04 21:40:36 · 169 阅读 · 0 评论 -
线段树---单点修改
思路:线段树,每个节点都被模拟成一条线段,负责维护这条线段(下面成为区间)从从左端点到有端点这一部分的信息。大致思路是这样的:一个父节点负责维护一块大区间的信息,他有两个左右子节点,编号为分别负责维护父节点的左一半区间和右一半区间。这个图是维护区间最大值的线段树.数据结构:根节点编号为1。编号为rt的节点,维护区间是[l,r];左儿子编号为rt*2,维护[l,(r+l)/2];...原创 2019-08-07 22:07:00 · 205 阅读 · 0 评论 -
tarjan算法-缩点
有向图的缩点就是把有向图中强连通分量缩成一个点(道理很简单,我到了这个强连通分量的任何一点,那么这个强连通分量上的点就都能被我访问了),在处理有向图的连通性问题时有很多作用。代码是对求连通分量的改的,cnt做连通量的编号,belong[],表示点属于哪个连通分量,vector<> p存储每个连通量的点。int Stack[maxn], low[maxn], dfn[ma...原创 2019-08-06 20:44:00 · 290 阅读 · 1 评论 -
tarjan-无向连通图割点
费了好大劲,从网上爬来的目前能接受这个,直接改了点的模板... <<思路来自这位大佬http://www.cnblogs.com/nullzx/,每看一次,理解就更深了一点>>思路:假设DFS中我们从顶点U访问到了顶点V(此时顶点V还未被访问过),那么我们称顶点U为顶点V的父顶点,V为U的孩子顶点。在顶点U之前被访问过的顶点,我们就称之为U的祖先顶点...原创 2019-09-04 21:40:06 · 231 阅读 · 0 评论 -
快速幂+矩阵快速幂+欧拉降幂
快速幂对于一个非常大的数进行指数运算时,运算会很慢。例如计算5195^{19}519时,直接算就是19个5相乘。快速幂则二进制分解19,得到10011,这时只需要计算3次就可得到答案设置ans=1,tmp,top从10011的低位指向高位,100115195^{19}519=510011(2)5^{10011(2)}510011(2)=51(2)5^{1(2)}51(2)∗*∗510(2...原创 2019-08-25 20:00:26 · 532 阅读 · 0 评论 -
Fishing Master 贪心+思维
2019CCPC秦皇岛站网络赛-1008Problem DescriptionHeard that eom is a fishing MASTER, you want to acknowledge him as your mentor. As everybody knows, if you want to be a MASTER’s apprentice, you should pass t...原创 2019-08-24 10:37:47 · 202 阅读 · 0 评论 -
Robberies-逆向思维01背包
HDU - 2955The aspiring Roy the Robber has seen a lot of American movies, and knows that the bad guys usually gets caught in the end, often because they become too greedy. He has decided to work in ...原创 2019-09-04 21:40:29 · 816 阅读 · 0 评论 -
多重背包
有N种物品和容量为V的背包,第种i件物品价值v[i],费用w[i],数量num[i]。求解在如何让背包获得最大价值。基本思路:可把每种物品拆分,拆分后的几份物品独立。例如把数量为22,价值为v,费用为w的物品拆成5份,每份包含1,2,4,8,7件。1,2,4,8,7可以组合成0~22内的任何数字。所以从这三份物品我们可以得到所有种情况。二进制拆分n=22。1,2,4,8可以组合成0~15的...原创 2019-08-23 17:53:44 · 158 阅读 · 0 评论 -
完全背包
有N种物品和容量为V的背包,第种i件物品价值v[i],费用w[i],每件商品取多次。求解在如何让背包获得最大价值。基本思路:如果按照01背包的思路,对于一种商品,不取,或取1件,2件,3件…时间复杂度太大。有一个优化,一维的01背包容量从前向后枚举,因为对于i状态,他需要一个没有选择i物品且容量更小的状态,而对于完全背包可以不考虑i种物品装了几次。for i=1…Nfor j=w[i]…...原创 2019-08-23 10:47:27 · 99 阅读 · 0 评论 -
01背包
有N件物品和容量为V的背包,第i件物品价值v[i],费用w[i]。求解在如何让背包获得最大价值。基本思路:对于每件物品,可以选着装或者不装。问题的可求解子状态是背包的容量为v(v<=V)时的最大属性。dp[i][j]表示在前i件物品,用容量为j的背包能获得的最大价值。状态转移公式:f[i][j]=max( f[i][j] , f[i][i-w[i]]+v[i] )for i=1…N...原创 2019-08-23 09:35:41 · 93 阅读 · 0 评论 -
线段树区间合并
**通过一道例题入门线段树区间合并例题: 输入n个 0,1数字. 操作 : 0 l r 查询[l,r]区间,输出最长连续1的长度; 1 l r x 修改[l,r]区间的值为x.思路区间信息问题可以用线段树,线段树的基本模板,每个节点主要维护区间最长1串,sum.len。此外,区间合并时(push_up),我们要求的两个子区间合并的最长1串,可以通过增加两个节点信息(下面还要讲一...原创 2019-08-16 23:28:51 · 325 阅读 · 2 评论 -
Comet-contest #14-C
题目链接:序列题意:一开始有一个长度为n的全0串,m次操作,每次操作:第i次操作,先将原来的每一个串复制成两个相同的串,再把相同的两个中的一个l,r区间修改为i。对于一个串含有「极大连续段」即为区间[l,r]相同。求解每次操作结束后所有串的所有「极大连续段」之和解析:定义一个函数f(x)f(x)f(x)表示含有以x(1<=x<=n)位置为「极大连续段」的结束点的串个数。对于每...原创 2019-11-09 00:21:27 · 98 阅读 · 0 评论 -
Consumer-简单依赖背包
HDU-3449先枚举箱子,在枚举箱子里的物品,把同一箱子里的物品当做01背包处理(不带箱子的费用): temp[ww]=max(temp[ww],temp[ww−stup]+stuv)temp[ww]=max(temp[ww],temp[ww-stup]+stuv)temp[ww]=max(temp[ww],temp[ww−stup]+stuv)每次枚举箱子结束,将得到的值再算上...原创 2019-11-06 14:03:15 · 167 阅读 · 0 评论 -
Doing Homework-状态压缩DP
HDU1074一开始想到这样枚举,但是开数组唯一表示的话,当N=15时太大了,且DP时不容易找到对应的上一状态。所以用状态压缩的方法,用一个n位的二进制数iii表示,第jjj位为0表示该状态还没有完成jjj作业,1表示已完成。我们从小到大枚举iii,新状态比前一状态多完成一个作业,例如当i==5i==5i==5,可以由前面的状态组合:dp[100]+sumt-d[1],dp[001]+su...原创 2019-11-06 11:29:12 · 209 阅读 · 1 评论 -
线段树区间合并专题
Hotel题意:一开始旅馆有1~n间空房间,陆陆续续来了一些旅游团。每个个旅游团想租到d间连续的房间,否则他们不租,且房间号尽量靠前。旅游团每次退掉从x开始的d间房间,退掉的房子又是空的了。输入:n房间数,q操作数。1表示租房 d表示连续的房间数;2表示退房,x开始号,d退房数。输出:每次租房时,输出被租出的第一个房间号。解析:合并时L,R,len,lazy维护;L代表左起最长 ...原创 2019-10-27 21:50:16 · 173 阅读 · 0 评论 -
LG旅行家的预算-贪心模拟
题目链接思路每次尽量跑到价格更低的油站时正好把油用完;如果即使把油加满也跑不到更低的油站,那就加满油跑到油价相对高最少的油站。ac代码#include<bits/stdc++.h>using namespace std;struct ac{ double p,d;}mp[510];bool cmp(ac a1,ac a2){ return a1.d<a2.d...原创 2019-10-27 21:05:07 · 131 阅读 · 0 评论 -
导弹拦截-DP-O(nlogn)算法
题目链接O(n)dp:dp[len],表示长度为len的序列最优的末尾高度是dp[len].核心代码:最长不上升序列如何不大于dp[len],dp[++len]=h[i]。否则将1-len长度的最接近且小于h[i]的位置换成h[i]。换成更高的,这样h[i]后面就可以打更多的导弹了。if(dp1[len]>=h[i]) dp1[++len]=h[i]; else {...原创 2019-10-26 22:06:55 · 497 阅读 · 1 评论 -
Cf#595 (Div. 3)D-贪心
1249D1 - Too Many Segments (easy version)1249D2 - Too Many Segments (hard version)题意:给n条平行线段,区间被线段覆盖,问:使所有点上最多有k次覆盖,最少需要删除多少条边。贪心的思路:从最左(点1)向右找当一个点被覆盖超过k,找到覆盖它的线段,删除右端点最远的线段,如果还超过k,再继续删除。easy版本一共只...原创 2019-10-23 21:14:17 · 528 阅读 · 0 评论 -
Cf#595 (Div. 3)E-DP题
E. By Elevator or Stairs?状态转移方程:d[i][0]=min(d[i−1][0],d[i−1][1])+a[i];d[i][0] = min(d[i - 1][0], d[i - 1][1]) + a[i];d[i][0]=min(d[i−1][0],d[i−1][1])+a[i];d[i][1]=min(d[i−1][1],d[i−1][0]+c)+b[i];d[...原创 2019-10-23 09:58:43 · 308 阅读 · 0 评论 -
LGP1993-+差分约束+思维建图+dfs版SPFA
LGP1993农场a比农场b至少多种植了c个单位的作物(a-b>c,建边a->b权值为c) 。农场a比农场b至多多种植了c个单位的作物 (a-b<c ,b-a>-c,建边b->a权值-c)。农场a与农场b种植的作物数一样多,(a<->b权值为0)。然后把所有点连在一个超级源点求最大路,若出现正环,这说明矛盾。(可以举例 例如 :a-b>1...原创 2019-10-22 11:50:35 · 116 阅读 · 0 评论 -
LGP1525-二分图判断+二分
可以将图上的所有点分成两个集合,同一集合内的点在图上没有连边。这种图称为二分图 参考博客-二分图的定义和判定二分图证明:染色法我们可以用两种颜色去涂一个图,使的任意相连的两个顶点颜色不相同,且任意两个结点之间最多一条边。如果发现相邻点染色成同一颜色,则这个图不是二分图。有dfs和bfs两种实现方法。LGP1525判断利用二分查找的最大权值删边后图是否是二分图#include<bit...原创 2019-10-20 15:37:06 · 131 阅读 · 0 评论 -
LGp2661最小环
LGp2661不压缩并查集#include<bits/stdc++.h>using namespace std;const int maxn=2e5+10; int g[maxn];int n;int fa[maxn];int cnt;int find(int i){ cnt++; if(fa[i]==i) return i; else return find(...原创 2019-10-19 11:29:50 · 102 阅读 · 0 评论 -
欧拉回路LGp1341
LGp1341联通判断+欧拉回路,路径判断+最小字典序欧拉图求解#include<bits/stdc++.h>using namespace std;const int maxn=200;bool mp[maxn][maxn];char ans[maxn*maxn];int du[maxn];int fa[maxn];int in[maxn];int n;void...原创 2019-10-19 11:26:39 · 126 阅读 · 0 评论 -
最近公共祖先lca
LCA(Least Common Ancestors),解决一棵树上两个节点x,y的最近公共祖先节点。在线算法:倍增倍增的思想与RMQ(Range Minimum/Maximum Query)相同。第一步,首先建树存边。第二步,预处理:存第一祖先是父节点和深度void dfs(int u,int pre,int d){ anc[u][0]=pre; dep[u]=d; for(i...原创 2019-10-09 13:03:57 · 87 阅读 · 0 评论 -
大小根堆
大小堆其实就是二叉堆,内部就是一棵二叉树。左图为大根堆,右图为小根堆大小根堆其实就是stl库的优先队列priority_queue<int,vector<int>,greater<int> > small; priority_queue<int> big;对于大小的定义可以在struct重载运算符大小堆的应用:1.求数列中前k小的数...原创 2019-09-22 21:10:11 · 783 阅读 · 0 评论 -
强连通缩点-返回边-最长路
P3119 [USACO15JAN]草鉴定Grass Cownoisseur题意:在有向图中,从1出发,每个点可以重复走,且允许走一次反向边,但要求最终必须回到1,求最多可以走多多少个点。第一步缩点,然后建新图,将缩点的大小作为正向边的边权。第二步,对于可以走一次反向边的方法,可以这样解:spfa求从1出发的正向图最长路dis1,再求spfa从1出发反向图的最长路dis2,dis2可以理解为...原创 2019-09-18 16:15:55 · 241 阅读 · 0 评论 -
权值并查集
洛谷P2024题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。 现有 N 个动物,以1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这 N个动物所构成的食物链关系进行描述: 第一种说法是“1 X Y”,表示 X 和 Y 是同类。 第二种说法是“2 X Y”,表示 X ...原创 2019-09-13 16:04:20 · 678 阅读 · 0 评论 -
网络流-费用流
最小费用最大流问题,图上每个边都有一个费用边权,费用一般是该条边运送单位流量的费用,求解在保证总流量最大的前提下,花费最少的费用。求解方法一般是将EK和BFSA结合1.在当前流量图中用BFSA找到有最小费用的增广路,增广该条路。2.将该条增广路的分别边费用和该增广路的最小容量相乘,得到该条增广路的费用。重复1 2,直到没有可增广路,结束。C++模板const int maxn=1e5+1...原创 2019-09-12 17:45:28 · 110 阅读 · 0 评论 -
网络流-最大流
网络流,指一次把物品源点s通过其他节点做中转运送到汇点t,每个条路都有最大限制量,即容量。最大流问题,求能运送到汇点t的最大量。(图上的数字表示的就是容量)要设置反向边。每次在图上BFS找到一条增广路,一次增广的流量为一条路径的最小残余容量,并将增加等量的反向边的容量。为什么要加反向边?可以理解为设置可反悔的机会,当发现可以以反边方向去增广时,就可以动用反向边的能量,增广把它当成普通的正...原创 2019-09-11 23:56:16 · 135 阅读 · 0 评论 -
最佳匹配问题-KM算法
最佳匹配时在最大匹配的基础上,在二分图上增加边权,求出匹配边权和的最大值。这里详细的讲解放这个链接km算法入门大概思路就是加入左边点的点权(等于最大边权),右边点边权为0,当左右点的边权和等于边权则可以匹配。每次按照匈牙利匹配,当发生冲突时,匈牙利撤回到最后一个点没有可以匹配的边时,左边点边权降低1,右边点边权增加1。再次匹配,若是不可以,继续+1,-1,知道chu’xian...原创 2019-09-11 10:34:40 · 2778 阅读 · 0 评论 -
Bellmen_Ford和SPFA
tomorrow…原创 2019-09-07 00:43:04 · 285 阅读 · 0 评论