算法入门
文章平均质量分 82
Df_cjc
这个作者很懒,什么都没留下…
展开
-
所有负权回路的判断
题目大意:给定路径的关系,问你n个点的最短路,如果最短路的值比3小或无法到达,就输出?又做到一个新类型的题目,但是不算太难,就是在spfa发现一个点的更新次数大于n侯进行的更新操作dfs因为发现了一个负权回路点后,他直接间接能到的点都会是负权点(就是不存在最短路),而我们一开始用前向星存边也就十分方便了多了的就是这个dfsvoid dfs(int u){ cir[u] = 1; ...原创 2018-03-13 20:07:22 · 699 阅读 · 0 评论 -
补一下素数筛
陆历川很热爱数学,最近他学了质数,他被质数深深的吸引了,但是陆历川有个习惯,他喜欢给一些东西编号,所以他决定给所有的质数编号,例如给2编号1,3编号2,5编号3........这样2,3,5就是质数里面的大当家,二当家和三当家了,陆历川现在知道了这些编号,现在他会给你一个数,他想知道这个数的所有的质因子里面的最大编号是多少?注:0和1的编号都是0。Input一个自然数N(0<= N &l...原创 2018-02-26 17:08:46 · 266 阅读 · 0 评论 -
差分约束系统——你能忍受得糖果数量
poj3159题目大意:分糖,a 能忍受分的糖果数 最多比b少c个,给你一系列这些关系,求x能忍受y最多多几个学习了差分约束系统,了解了不等式<=以及>=对应得最短路最长路得转化,数形结合,也就很简单了,不过这个题有bug啊,正常得spfa中队列过不去,看了题解才知道都没过去哈哈哈,然后学习了模拟栈得用法(注释中),还是很好的~~#include <iostream>...原创 2018-03-08 23:07:34 · 227 阅读 · 0 评论 -
Floyd & 状压DP —— poj331
一开始得思路有一点小问题,把他想成最小生成树+floyd算法来做了,但是再状态得重复上以及往回走得vis判断上出现了问题,我就觉得思路不对了,看了下题解,用的时floyd算法求最短路,然后利用Dp遍历状态,求总体的最短路,也算借助此机会复习了一下最短路了(悲催的时,最短路得学习过程中,就忽略了暴力得floyd得学习(转载……)) Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首...原创 2018-02-21 11:07:51 · 231 阅读 · 0 评论 -
不相邻问题——状压Dp——HDU1565,POJ3254
先做的HDU1565方格取数问题,在格点取数,所取得数不能相邻,问最大能取得总和是多少容易想到——dp[i][j]表示当前i行j状态所取得数,如何dp呢???首先针对每一行找到可以通过得方方案(左右不相邻即可——存储到pass_state【】中)void find_pass(){ for(int i = 0;i < (1 << N);i++) { ...原创 2018-02-20 16:41:37 · 320 阅读 · 0 评论 -
状压Dp
入门题是一个摆棋盘得问题,n * m得棋盘中可以摆放1 * 2 和 2 * 1 得棋子,问你摆满有几种摆放得可能,比较特得是n得范围特别小,m得范围大一些,这就是一个标志,可以向状态压缩上靠拢。首先得寻找一个状态,这个状态的值就只有0和1——可以用二进制来表示,就是2^n,所以这也是为什么n得范围会很小的原因了,我们可以遍历每一列,然后取舍当前列的摆放,用0001001表示对下一列得影响(横着放的...原创 2018-02-18 20:01:57 · 276 阅读 · 0 评论 -
LCS,LIS,LCIS
LCS最长公共子序列:状态方程是dp[i][j]——并未定义必须以谁谁谁结尾,就是代表a序列从1-i,b序列从1-j的最长公共部分的长度状态转移:1->当a[i] == b[j]的时候很明显dp[i][j]的值==dp[i-1][j-1] + 1 2->当a[i] != b[j]的时候,要去寻找最优解,肯定是max(dp[i-1][j],dp[i][j-...原创 2018-02-28 11:33:01 · 266 阅读 · 0 评论 -
Flord算法传递闭包
POJ3660对于flord算法得学习,这篇博客写的非常好http://blog.csdn.net/ljhandlwt/article/details/52096932这个题问你给你n头牛得前后关系,问你一共可以确定多少头牛得位置了,用到了传递闭包也就是关系得传递比如 3 > 2 ,2 > 1 => 3 > 1,也就是我们可以重已知得关系中获得更多得关系,关系全部获得后...原创 2018-03-07 21:26:07 · 473 阅读 · 0 评论 -
延迟标记——线段树进阶
延迟标记理解起来是很好理解,但是用代码实现却对我来说有些困难,可能是递归,优化,以及区间操作的原因,弄得我现在有点昏昏的,写一个博客,整理一下思路根据题目可以以下的准备工作这是第一个学习版本,求和以及sum延迟标记add都放在了结构体外面,使用了宏定义来简便代码的书写,数组开的大小依据题目,练习题目是POJ 3468 A Simple Problem with Intege原创 2018-02-07 20:17:22 · 1189 阅读 · 0 评论 -
拓扑排序与VAS图
VAS图(我的理解)就是由一系列计划得关系得出的单项图例如c1->c2表示要进行c2必须要进行c1,描述完所有计划的先后关系后,也就得到了一张图,对这张VAS图进行排序就是拓扑排序,排序得结果就是所有计划进行得先后顺序,因为存在并列的计划,所以排序结果并不一定唯一。 思想就是利用图论得一些知识 先对队列进行初始化——循环遍历所有的点,如果发现点的入度为0的化就入队,由于题目大都会加上一个限制:尽原创 2018-02-27 14:42:46 · 559 阅读 · 0 评论 -
离散化—区间覆盖——线段树实践POJ2528
离散化——目的是压缩区间范围——优化线段树区间覆盖问题——传统的cover数组再加上——这个题目的特殊性——计算的是最终能看到海报的数量——所以节点的值在这里我的含义是第几张海报覆盖了这个节点好,看一下准备工作#include <iostream>#include <algorithm>#include <string.h>using namespac...原创 2018-02-13 16:32:12 · 358 阅读 · 0 评论 -
初识线段树
虽然学的不多,但是学习线段树的时候,还是让我想起了堆排序,对堆的维护就类似线段树的更新操作。总之,线段树是一个完全二叉树,利用了二分的思想,大大优化了对于区间的一系列操作这就是一个最基本的结构,针对这个结构来看一看我们的基础准备const int max_node = 1 << 19;const int Max = 2e6 + 10;//针对题目struct node{原创 2018-02-07 15:27:53 · 177 阅读 · 0 评论 -
二维树状数组——poj1195
题目大意:二维区间呢,你要设法求出任意一个给定子区间内的活跃手机数量,并且设法更新任意区间内的值初识树状数组,在一维上很好理解,到了二维,仿照学习数组时,从一位数组过度到二维数组的方法,大可以把二维树状数组看成一个一维树状数组,只不过这其中的每一个C[i]都表示的是一个一维树状数组对于求和c[i],你要求出所有包含其中的j(一维树状数组求和)long long Sum(int x,in原创 2018-02-07 11:19:29 · 289 阅读 · 0 评论 -
【最大流之ek算法】HDU1532 求最大流
本来是继续加强最短路的训练,但是遇到了一个最短路 + 最大流的问题,最大流什么鬼,昨天+今天学习了一下,应该对ek算法有所了解,凭借学习后的印象,自己完成并ac了这个最大流的模板题题目大意:都是图论,只是这个图给你的关系是网络关系,就是从s到t的路上,你运送的东西的量必须满足所有路径的限制,而题目给出的就是限制,我们用一个二维数组c存储i到j这一条边的总限制,注意的是,初始化c数组为0,然后增...原创 2018-03-15 17:08:09 · 309 阅读 · 0 评论 -
莫比乌斯反演优化版
正常的莫比乌斯反演写出后,对应某些题目实践尽然还会被卡,证明还有优化得余地,面对这个反演函数我们能在哪做文章呢??求和?NO,莫比函数?NO,F(d)may be?F(d)是我们最不费力的一个,特就是b/i,d/i(b,d是区间上限),但注意这是相除后去余的,所以你模拟一下,看一看b i b / i b / (b / i)5 1 5 ...原创 2018-03-01 19:54:59 · 209 阅读 · 0 评论 -
计算几何之叉积(外积)得应用
这几天学了一下计算几何,很多内容以前都接触过,但是这么多得定理和意义却从来没想到过,也是吃惊得学习了一场叉积(外积)是一个具有大小和方向得量,方向和点a,b所在得平面垂直,满足右手螺旋定则a * b得叉积是double cross(Point p0,Point p1,Point p2){ Point a,b; a = p1 - p0; b = p2 - p0; ...原创 2018-03-09 21:07:04 · 387 阅读 · 0 评论 -
来回最短路POJ3268
这个题得主要考点在于给你的图是去了再回来得有向图,如何模块化解决呢就是转变图的方向,我们根据初始得放心求出每个点到x得最短路,然后转变所有路得方向再求出所有点到x得最短路,最后一相加就是最后的来回了~~实现得时候我用到了数组指针,感觉非常得方便#include <iostream>#include <string.h>#include <cstdio>...原创 2018-03-06 17:35:00 · 235 阅读 · 0 评论 -
逆思想‘最长路’emmmPOJ1797
POJ1797点击打开链接这个题很是不错我感觉很容易把这个题和上一个青蛙跳的题联系起来做,我也确实联系起来了,可还是没能完整得Ac,是因为我的算法思路还是最短路,这里错了这个题目得要求是,从1到n得公路,最大承载量是多少,不仅仅是求最大值,你得确保那个值在这一个通路上都能满足承载得值比如限制1 - 2 上是3,2 - 3上是5,1-3上是4,那么结果是4,虽然5大,但5只满足2-3,没法满足1-2...原创 2018-03-06 15:40:05 · 175 阅读 · 0 评论 -
最短路Dijksta算法温故
POJ2387最基本得最短路问题,双向图,无负权回路,可以用来熟悉一下自己得思路,和预处理得过程#include <iostream>#include <string.h>#define inf 0x3f3f3f3fusing namespace std;const int maxn = 1010;int mp[maxn][maxn];int dis[maxn]...原创 2018-03-06 12:33:01 · 527 阅读 · 0 评论 -
KMP习题
HDU3746题目大意:对于给你的一个字串,最少添加多少个字符可以构成至少循环两次的字串(完整循环)思路:是对next数组的考察如果该串构成循环——》len - net[len]就是最小循环节的长度,且len % (len - net[len]) = 0 ——》en / (len - net[len]) 就是循环次数了因为是要构成完整循环,我们只需要考虑整个字串,不需要去想内部是不是有循环什么的所...原创 2018-03-05 18:41:02 · 261 阅读 · 0 评论 -
POJ2502乘坐地铁上学
POJ2502题目大意:给你一个二维地图,起点终点,以及多条地铁线路(只有相邻两站才可互通)中的站点坐标。步行以及坐地铁的速度;思路:难点在于建图,一个多小时磨磨蹭蹭,都是因为思路没捋清楚~~,对于每一条地铁线,在输入站点坐标的过程中我们就可以建立图像了;输入完成后,遍历所有的点再建立,以步行为计量单位的图像。就ok啦,然后裸spfa就好了#include <iostream>#...原创 2018-03-12 15:15:01 · 230 阅读 · 0 评论 -
初识欧拉函数
小于n的正整数中与n互质的数的数目(φ(1)=1)有几个性质:* p的欧拉函数的值:当n为质数的时候值为n - 1* p^k的欧拉函数为p^k - p^k-1=p^k(1 - 1/p)[p为质数,k为大于等于1的正整数] :因为p是质数,所以当一个数不包含质数p才可能与n互质,所以一共有p^k-1个数据1*p,2*p,3*p……p^k-1 * p* 若n = p1 * p2 ...原创 2018-02-25 21:03:09 · 247 阅读 · 0 评论 -
SG函数
初识博弈的时候了解了P点和N点,进而可以学习SG定理及其函数游戏和的SG函数等于各个游戏SG函数的Nim和定义mex运算mex(s)表示最小的不属于S集合的非负整数对于SG(x) = mex(s) S集合是遵守游戏规则的前提下取了石子之后,可能出现的所有的情况的集合也就是后继状态void getsg(int n){ int i,j; memset(SG,0,sizeof(SG))...原创 2018-02-25 16:37:01 · 443 阅读 · 0 评论 -
初识博弈
初始了解了一些博弈,根据特定的规则,学习了一些只会和规律首先是 巴什博弈:HDU1846,最基本的先手后手赢问题,对于一堆石子我要采取什么拿的方法才能让对方最后无子可那呢,那就是在我拿完之后尽可能的让n是m+1的倍数(n是总数,m 是我能拿的上限) int flag = n % (m + 1); if(flag >= 1)cout<<"first"<&l...原创 2018-02-25 15:39:36 · 189 阅读 · 0 评论 -
STL中二分查找函数
#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ int a[12] = {1,6,31,66,67,68,69,70,71,73,76,79}; int c[12] = {79,76,73,71,70,69,...原创 2018-03-03 20:46:10 · 427 阅读 · 0 评论 -
KMP回顾学习
记住这张图,getnext就是对一个已知的待匹配的串进行分析,nex【i】表示当a【i】匹配失败后我能跳到哪里,继续尝试匹配,而不是每一次失败都从头再来,先来看看代码const int maxn = 1e5;int net[maxn];char a[maxn];void get_next(int len){ int i = 0,j = -1; nex[0] = -1;/...原创 2018-03-03 19:48:16 · 158 阅读 · 0 评论 -
POJ2653判断线段相交
POJ2653题目大意:按顺序放木棒,问最后所有的木棒中上面没有木棒的木棒的索引是……思路:按理说线段相交的题目做的听多了,这个应该不算新鲜,但是这个题,还是让我学到了认真读题,面对这个题很容易想到对于新输入的一根木棒,遍历它前面所有的木棒,判断是否有重合的有的话,把那个被重合木棒的索引标记好,这样是很好的但是两层循环就差不多是1e5 * (1 ~ 1e5)的复杂度了,所以看题看题:题目说,最后符...原创 2018-03-11 11:03:49 · 183 阅读 · 0 评论 -
计算几何小结1
部分未见过的内容摘自http://blog.csdn.net/clover_hxy/article/details/53966405一、精度控制计算几何经常牵扯到浮点数的运算,所以就会产生精度误差,因此我们需要设置一个eps(偏差值),一般取1e-10之间,并用下面的函数控制精度#define eps (1e-10)#define equal(a,b) (fabs((a)-(b))) <...原创 2018-03-10 10:44:20 · 305 阅读 · 0 评论 -
初识线性dp
线性dp其实早就研究过了,最长连续子序列问题,但是今天又发现了一点——最长上升子序列的长度就是不下降子序列的个数,这句话对HDU1257这个题的解很有帮助,但是咋证明嘞,我也还没证明出来,只是想到了自己的理解方式,最长上升子序列的长度一定能平分进每一个下降子序列的个数例如6 2 3 7 1 2 3 4有很多方法都是4个:2 1 || 3 2 || 6 3 || 7 46 2 1原创 2018-02-04 21:25:53 · 351 阅读 · 0 评论 -
string的子集求法
现在仅仅有最基本的子集求法是substr函数很好实现,有两个参数,一个是开始位置,另一个是拷贝长度,返回值为一个字符串,可以进行赋值或者放入容器#include#includeusing namespace std;int main(){ string s,s1; int cnt = 0; while(cin>>s) { for(int i = 0;i < s.size原创 2017-12-03 20:21:53 · 536 阅读 · 0 评论 -
HDU1019
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which is divisible by all the numbers in the set. For example, the LCM of 5, 7 and 15 is 105.InputInp原创 2017-12-11 19:57:48 · 363 阅读 · 2 评论 -
HDU1017
Given two integers n and m, count the number of pairs of integers (a,b) such that 0 This problem contains multiple test cases!The first line of a multiple input is an integer N, then a blank l原创 2017-12-11 18:47:37 · 307 阅读 · 0 评论 -
HDU1014
Computer simulations often require random numbers. One way to generate pseudo-random numbers is via a function of the formseed(x+1) = [seed(x) + STEP] % MODwhere '%' is the modulus operator.原创 2017-12-11 18:22:22 · 255 阅读 · 0 评论 -
快速幂之二进制
#includeusing namespace std;int main(){ int a,b,c; long long ret = 1; while(cin>>a>>b>>c) { a %= c;//注意取模的运算法则 while(b > 0) { if(b & 1)//如果二进制中最后一位是一的话那就乘进结果 { ret *= a; }原创 2017-12-03 09:51:08 · 359 阅读 · 0 评论 -
SDNU__1025.马踏飞燕
无聊的陶陶准备编写一款游戏,名字就叫做“马踏飞燕”,在这款游戏中有个一个100*100的坐标,把马放在任意一个坐标点,再把燕子放在任意一个坐标点,并且燕子不会移动,马只能按照象棋规则走“日”。若4步之内能“踏”到燕子,则成功。笨蛋的陶陶不知道该怎么去写,现在请你帮助他。走“日”说明:当马的坐标为(5,5)的时候,马下一步可以走的坐标有8个点,分别为(4,3)(6,3)(3,4)(7,4)(3,原创 2017-12-02 15:31:42 · 510 阅读 · 0 评论 -
SDNU__1194.传纸条&1032.机器人
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以原创 2017-12-02 00:24:01 · 518 阅读 · 0 评论 -
SDNU1171.合并果子优先队列
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定原创 2017-12-10 21:09:08 · 297 阅读 · 0 评论 -
sdnu-并查集-weeklyexam ——E - Ubiquitous Religions
There are so many different religions in the world today that it is difficult to keep track of them all. You are interested in finding out how many different religions students in your university beli原创 2017-12-01 16:17:02 · 210 阅读 · 0 评论 -
分数转化为小数
#includeint main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("%d.",a/b); a=a%b; //还得注意末尾的余数进位问题 while(c--) { a*=10; int q=a/b; if(c==0&&(a%b)*10/b>=5) { q++; } printf("原创 2017-10-25 10:49:15 · 967 阅读 · 0 评论 -
分治算法实践——书页!
分治算法——页码问题原创 2017-10-22 21:50:51 · 456 阅读 · 0 评论