![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法竞赛
菜菜魁
fighting!
展开
-
Manacher模板
#include<iostream>#include<algorithm>#include<string.h>#include<string>using namespace std;string str;char s[2000005];int p[2000005];int main(){ while(cin >>...原创 2018-10-06 09:05:02 · 117 阅读 · 0 评论 -
拓展欧几里得算法
已知 a,b 求 一组解 x,y 满足 ax+by = gcd(a, b) 这个公式#include<cstdio>typedef long long LL;void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d){ if (!b) {d = a, x = 1, y = 0;} else{ ...原创 2018-08-05 15:40:39 · 119 阅读 · 0 评论 -
hdu 3038 How Many Answers Are Wrong(向量偏移扩展并查集)
文章参考借鉴于https://www.cnblogs.com/liyinggang/p/5327055.html,到处都是大佬,我还应该多学习。本题的意思是给你一堆区间,每个区间的和为v,问你有多少条件发生了冲突。问题主要在于怎么更新并查集,因为各种路径关系很复杂,不能单纯的连接。这里用到了向量偏移思想。共分两种情况:第一种,a的父结点和b的父结点不同,我们要连接两个父结点。盗...原创 2018-07-28 10:07:11 · 161 阅读 · 0 评论 -
UVA - 10766 Organising the Organisation(生成树计数模板)
本题的题意是给你n个人,m对人不能相互领导,k是总领导,然后给出哪m对人,问你有多少种方法。其实谁是领导无所谓的,因为这是一个无向树,这是一个关于生成树计数的模板题,代码如下:#include <cstdio>#include <cstring>#include <iostream>using namespace std; typedef lon...原创 2018-07-31 19:50:53 · 203 阅读 · 0 评论 -
最小m段和问题(划分dp)
3278 最小m 段和问题 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold题解题目描述 Description给定 n 个整数(不一定是正整数)组成的序列,现在要求将序列分割为 m 段,每段子序列中的数在原序列 中连续排列。如何分割才能使这 m 段子序列的和的最大值达到最小?输入描述 Input Description 文件的...原创 2018-07-27 19:02:08 · 2968 阅读 · 0 评论 -
UVA - 11183 Teen Girl Squad(最小树形图)
给你T组样例,n个点,m条边,问你能不能做出一个图,使得从0点出发到所有点的总权值最小。这是树形图的模板题,只要学完原理就很容易看懂代码https://blog.csdn.net/qq_38367681/article/details/81299822;代码如下#include <iostream>#include <cmath>#include <cs...原创 2018-07-31 14:11:31 · 196 阅读 · 0 评论 -
POJ - 3164 Command Network(朱刘算法 最小树形图)
就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T中所有边的总权值最小。解决这种问题要用到朱刘算法。朱刘算法有以下五步:1、找到除了root以为其他点的权值最小的入边。用In[i]记录2、如果出现除了root以为存在其他孤立的点,则不存在最小树形图。3、找到图中所有的环,并对环进行缩点,重新编号。4、更新其他点到环上的点的距离,如:(in【j】表示...原创 2018-07-31 12:05:16 · 219 阅读 · 0 评论 -
UVA - 11624 Fire!
在一个迷宫中,有一个人J和一些火苗(用F表示,数量很多),人和火苗同时移动,问人在不触碰火苗燃烧地方的情况下,能不能出去,及不与火苗走的路径相交。本题一共两种解法,我们知道人和火苗的路径是不能确定的,而求某一种东西的最短时间一般用BFS,两种状态同时转换,怎么办呢?第一种方法,进行两边BFS,第一遍记录火苗的路径,并存储火苗到每一个点的最短时间,第二遍bfs走人,每一步的时间要小于火苗蔓延...原创 2018-07-23 09:44:58 · 133 阅读 · 0 评论 -
FZU - 2150 Fire Game
有T组数据,每组数据包含一个n*m的图,其中#代表草,'.'代表没有草,两个小孩一起去烧草,两个小孩起始位置任意,求最少的烧完时间,所烧的第一块不花时间。两个孩子位置任意,所以我们遍历整张图,选所有两个点的情况进行bfs测时间,并依次比较选择最少的时间。#include <iostream>#include <cstring>#include <queu...原创 2018-07-22 20:33:46 · 233 阅读 · 0 评论 -
POJ - 3414 Pots
这道题的题意是给你两个容器,问你通过容器A和容器B能获得容量为C的液体。其中操作有三种,fill(a):把a填满,drop(a):把a倒掉,pour(a,b):把a倒入b中。要求把操作顺序输出。有很多种操作方式,我们一种一种遍历,直到出现结果为止,可以采取bfs的方式,这道题的难点在于怎么把路径输出。在bfs中,我们开始会选区队首的元素,通过队首的元素来获得队尾的元素,所以我们只需要在队尾标记...原创 2018-07-22 19:11:55 · 215 阅读 · 0 评论 -
POJ - 3126 Prime Path
给你n对四位素数,问你从每对中的一个,变成另一个,需要多少步操作,其中每步操作只能改变四位数中的一位,改变之后也必须为素数,并且数字不能以0开始。开始来一遍埃氏筛法,删选四位数以内的全部素数,然后再进行bfs。代码如下#include <iostream>#include <algorithm>#include <queue>#include &...原创 2018-07-22 16:44:24 · 118 阅读 · 0 评论 -
POJ - 1426 Find The Multiple
给你一个n(n<=200),输出是n的倍数并且全部由十进制的01构成的所有情况中的一种。这道题的难点在于对一个公式的理解,假设一串数字是abcde, 让它对p取余,结果和(((((a%p)*10+b)%p)*10+d)%10)*10+e)%p等价,所以我们枚举01序列进行取余操作,就能得到结果,不用担心数据太大。#include <iostream> #includ...原创 2018-07-22 16:39:57 · 115 阅读 · 0 评论 -
数论四大定理
1.威尔逊定理:当且仅当p为素数时:( p -1 )! ≡ p-1 ( mod p )即若p为质数,则p能被(p-1)!+1整除 2.欧拉定理:欧拉定理:也称费马-欧拉定理若n,a为正整数,且n,a互质,即gcd(a,n) = 1,则a^φ(n) ≡ 1 (mod n)φ(n) 是欧拉函数: 欧拉函数是求 1到n-1 中 与n互质的数 的数目如果n是质数,那么...原创 2018-08-05 16:19:47 · 3961 阅读 · 0 评论 -
欧拉函数
欧拉函数怎么求呢?原谅我不会。。。我只知道有个速度很快的打表算法和求单个的算法,代码如下:单个://欧拉函数int phi(int x){ int ans = x; for(int i = 2; i*i <= x; i++){ if(x % i == 0){ ans = ans / i * (i-1); ...原创 2018-08-05 17:13:07 · 159 阅读 · 0 评论 -
HDU - 1074 Doing Homework
学dp的一定要对数据有一定的敏感性,判断一个题是否是dp直接通过判断是否存在数据的动态转移即可。n <= 20一般是状压, n <= 1000一般就是比较普通的划分区间背包之类dp,也可能要自己搭建dp方程,不过都比较简单。 n <= 1000000可能是斜率或者四边形优化dp,当然也可能是借助二分之类的优化,时间复杂度在O(n)或者O(nlogn)。这道题就是给你一堆科目,...原创 2018-10-01 13:52:42 · 129 阅读 · 0 评论 -
二项式反演公式
二项式反演公式 那个括号起来的就是组合数,我记得组合数那章我有说过所以来一道例题:设g(i)表示正好有i封信装错信封那么全部的C(n, i)*g(i)加起来正好就是所有装信的情况,总共n!种情况n! = Σ C(n, i)*g(i) (i从0到n)那么f(n) = n!,所以f(x) = x!那么我们要求g(n)根据公式 g(n) = Σ ...原创 2018-08-07 12:37:58 · 1429 阅读 · 0 评论 -
母函数
有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?每种重量各有几种可能方案?假如x的幂次数表示几克的砝码那么1克的砝码表示为1+x^12克的砝码表示为1+x^23克的砝码表示为1+x^34克的砝码表示为1+x^4 每个砝码都可以选择取或不取所以这里的1可以认为1*x^0,表示不取这颗砝码 那么把这些乘起来(1+x^1)(1+x^2)(1+x^3...原创 2018-08-07 12:20:30 · 106 阅读 · 0 评论 -
容斥原理
在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法。这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复。这种计数的方法称为容斥原理。三个集合的容斥原理: 设A, B, C是三个有限集合那么|A + B + C| = |A| +...原创 2018-08-06 18:22:44 · 194 阅读 · 0 评论 -
康托展开
代码如下:void cantor(int s[], LL num, int k){//康托展开,把一个数字num展开成一个数组s,k是数组长度 int t; bool h[k];//0到k-1,表示是否出现过 memset(h, 0, sizeof(h)); for(int i = 0; i < k; i ++){ t = n...原创 2018-08-06 17:59:21 · 126 阅读 · 0 评论 -
卢卡斯定理(解决大组合数)
现在来了新问题,如果n和m很大呢,比如求C(n, m) % p , n<=1e18,m<=1e18,p<=1e5看到没有,n和m这么大,但是p却很小,我们要利用这个p上帝说要有光,于是便有了光。卢卡斯说要有C(n, m) % p = C(n / p, m / p) * C(n%p, m%p) % p于是便有了大组合数有解。代码如下:LL...原创 2018-08-06 16:40:33 · 216 阅读 · 0 评论 -
中国剩余定理(孙子定理)
参考自:http://www.cnblogs.com/linyujun/p/5199415.html,不是因为我偷懒,是因为巨人已经撑起了肩膀。中国剩余定理,又名孙子定理能求解什么问题呢?问题:一堆物品3个3个分剩2个5个5个分剩3个7个7个分剩2个问这个物品有多少个 解这题,我们需要构造一个答案我们需要构造这个答案5*7*inv(5*7, 3) ...原创 2018-08-06 12:11:33 · 259 阅读 · 0 评论 -
组合数(杨辉三角)
原来组合数和杨辉三角是有关系的:杨辉三角上的每一个数字都等于它的左上方和右上方的和(除了边界) 第n行,第m个就是,就是C(n, m) (从0开始)所以以后求杨辉三角或者组合数都可以用到下面的递推公式:#include<cstdio>const int N = 2000 + 5;const int MOD = (int)1e9 + 7;int com...原创 2018-08-06 10:31:35 · 4674 阅读 · 0 评论 -
poj-3281 Dining(最大流入门问题)
题意:有N头牛,F个食物,D个饮料。N头牛每头牛有一定的喜好,只喜欢几个食物和饮料。每个食物和饮料只能给一头牛。一头牛只能得到一个食物和饮料。而且一头牛必须同时获得一个食物和一个饮料才能满足。问至多有多少头牛可以获得满足。最大流属于一种什么问题呢?在我看来,如果我们遇到一堆限制条件,问你在满足这些限制条件的情况下找到最大的某些东西的时候,这个时候就要想到最大流,没有源点和汇点我们就建立原...原创 2018-08-01 15:32:22 · 176 阅读 · 0 评论 -
最小生成树计数模板及原理
参考于:https://blog.csdn.net/jarily/article/details/8902402*算法引入:*给定一个含有N个结点M条边的无向图,求它最小生成树的个数t(G);**算法思想:*抛开“最小”的限制不看,如果只要求求出所有生成树的个数,是可以利用Matrix-Tree定理解决的;*Matrix-Tree定理此定理利用图的Kirchhoff矩阵,可...原创 2018-08-01 11:05:53 · 527 阅读 · 0 评论 -
poj1182 食物链(路径压缩(向量偏移)扩展并查集)
和之前那个模板道理是一样的:https://blog.csdn.net/qq_38367681/article/details/81257566;直接上代码:#include<cstdio>#include<cstring>using namespace std;const int MAXN=50000+100;int pa[MAXN];int v[M...原创 2018-07-28 11:26:14 · 112 阅读 · 0 评论 -
线段树扫描线问题(HDU - 1255 POJ - 1177 HDU 1542等等)
博主真的很厉害,写得非常好,我学到了很多知识,感激博主,我直接转载了这个博客,以后用来做模板。博客转自:https://blog.csdn.net/lwt36/article/details/48908031;HDU 1542 [POJ 1151] Atlantis (矩形面积并) 题意: 求N<=100个矩形的面积并 分析: 离散化: 这些...转载 2018-07-30 16:49:58 · 349 阅读 · 0 评论 -
POJ - 2195 Going Home(最小费用最大流模板题)
参考自:http://www.cnblogs.com/gtarcoder/p/4890739.html最小费用最大流 通过EK,Dinic,ISAP算法可以得到网络流图中的最大流,一个网络流图中最大流的流量max_flow是唯一的,但是达到最大流量max_flow时每条边上的流量分配f是不唯一的。 如果给网络流图中的每条边都设置一个费用cost,表示单位流量流经该边时会导致...原创 2018-08-03 20:07:01 · 576 阅读 · 0 评论 -
POJ - 1087 A Plug for UNIX(最大流)
题意:在一个会议室里有n种插座,每种插座一个,每个插座只能插一种以及一个电器(或者适配器),有m个电器,每个电器有一个插头需要插在相应一种插座上,不是所有电器都能在会议室找到相应插座,有k种适配器,每种适配器可以有无限多数量,每种适配器(a, b)可以把b类插座变为a类插座,问最后有多少个电器无法使用。建图:其实最初的n个电器不是全部,可能由适配器转换出来别的,也可能有电器需要的但是在n中不存...原创 2018-08-03 18:08:17 · 385 阅读 · 0 评论 -
1090 加分二叉树
1090 加分二叉树 2003年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond题解 查看运行结果题目描述 Description设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tre...原创 2018-07-26 13:42:49 · 163 阅读 · 0 评论 -
HDU - 1754 I Hate It(线段树求RMQ)
给你一个区间,求这个区间的最大值,并且要进行点更新,跟区间更新没什么区别的,不过涉及到区间更新,属于动态RMQ,静态RMQ有更简单的做法(https://blog.csdn.net/qq_38367681/article/details/81143373),本题代码如下:#include <iostream>#include <algorithm>#include...原创 2018-07-29 13:44:58 · 129 阅读 · 0 评论 -
HDU - 1166 敌兵布阵 (线段树)
一个点更新,区间查询的线段树,不过点可以当成一个长度为1的区间,所以我直接采用了区间更新的办法,用lazy数组存储更新状态,使用到才更新,更加省时间。代码如下#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <str...原创 2018-07-29 13:33:29 · 165 阅读 · 0 评论 -
最小生成树 次小生成树
老实说看完并查集再看最小生成树已经没什么意思了,在kuangbin大佬的训练题中没有什么特别有难度的,除了次小生成树。先挂两个板子。(最小生成树的学习可以借鉴《图论与集合》,或者各位大佬的博客)#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>...原创 2018-07-28 15:30:24 · 223 阅读 · 0 评论 -
POJ - 3259 Wormholes(求负环)
讲的是有n个农场,m条路,w个虫洞,正常的路径使人从a到b,花费t时间,虫洞可以使人从a到b,且时间回到t之前。问有个人出发到返回能不能看到以前的自己,也就是判断是否存在负环。代码分两种,一种遍历所有的点,如果这个点连接虫洞,那么以这个点为源点进行spfa判负环,把所有的点遍历一遍即可得出答案;还有一种比较巧妙,建立一个超级源点连接所有的带父权值的边的一个点,这样从源点出发,就可以判断所有...原创 2018-07-25 16:46:54 · 169 阅读 · 0 评论 -
POJ - 1860 Currency Exchange(求负环)
一个人在一个银行存得有钱,不同的银行有不同的汇率和手续费,他把这些钱转到别的银行,操作是(v - 手续费) * 汇率。问能不能转回来时钱上涨。这无非就是求经过所有路径,看是否存在一条不断上涨的路径,类似于负环,只不过判断条件变了。判断条件:d[v] < (d[u] - es[i].w2) * es[i].w1;#include <iostream>#include &...原创 2018-07-25 16:37:03 · 151 阅读 · 0 评论 -
POJ - 1797 Heavy Transportation(最大化最小边)
最大化最小值是指从一个结点到另一个结点,所能走的所有路径中,选择一条路径的最小边比其他的路径最小边都大。还是在最短路的基础上随便改改就行(相信我,改的太随便就会wa,亲身经历)。判断条件:d[v] < min(es[i].w, d[u]);关键式:d[v] = min(es[i].w, d[u]);#include <iostream>#include <a...原创 2018-07-25 16:01:33 · 207 阅读 · 0 评论 -
POJ - 2253 Frogger(最小化最大边)
从第一个点到第二个点,在所有的路径中,选择一条路径,使得这条路径的最大边比其他路径的最大边小。是小数,记得使用double,记得数组大小,记得路径是双向的,不要犯zz错误(我是zz)。判断条件:d[v] > max(es[i].w, d[u]);关键式:d[v] = max(es[i].w, d[u]);#include <iostream>#include &l...原创 2018-07-25 15:50:53 · 142 阅读 · 0 评论 -
链式前向星版spfa最短路
spfa与dijkstra和Bellman-Frod一样都可以用来做最短路径问题,但是dijkstra没法判断负环,而Bellman-Frod虽然能检测负环但是效率太低。所以这个时候我们不得不借助于spfa。spfa为什么能操作负环呢?其实dijkstra和spfa的工作原理差不多,dijkstra是一个优先队列,只选取当前最小的,没考虑到后面负权值对后面的影响;而spfa是一个普通的队列,他只会...原创 2018-07-24 09:42:00 · 339 阅读 · 0 评论 -
POJ - 3984 迷宫问题
打印路径的迷宫问题,根据bfs来说,队尾是由队首得到的,所以我们只需要加一个映射,让队尾映射到队首。用函数提供的queue函数比较法麻烦,需要建立指针,所以自己手撕了一个队列,用l和r表示边界,代码如下#include <iostream>#include <algorithm>#include <cstring>#include <queue...原创 2018-07-23 10:29:18 · 153 阅读 · 0 评论 -
基础dfs搜索讲解
dfs名为深度优先搜索,顾名思义,是对一个问题按照一种模式不断更新搜索,当到无法搜索时,回复上一状态,继续搜索,直到搜索完成。二魁也做了不少dfs的题,发现都是在一些原有的基础上发生一些变动,比如加上时间限制,比如加上情况判断,又或者各种剪枝,但是本质逃不出dfs的基础问题。当然,有一些变化比较大的,比如匈牙利算法,但是dfs的核心思想不会变。我对于dfs算法的核心理解为对问题的所有可能按照...原创 2017-12-16 21:22:22 · 549 阅读 · 0 评论 -
POJ - 2528 Mayor's posters(离散化+区间更新)
给你n个壁纸,壁纸之间高度相同,按照顺序粘壁纸,问能看见多少张壁纸。首先壁纸的距离范围太长,无法用数组存储,需要先离散化,然后进行区间更新,用数组维护区间,每个区间数组的值有(-1:这个区间没壁纸;0:这个区间有多个壁纸;1~n:这个区间是第i个壁纸)。代码如下:#include <cstdio>#include <cstring>#include <a...原创 2018-07-29 17:21:07 · 211 阅读 · 0 评论