
51NOD
文章平均质量分 76
stormjing7
这个作者很懒,什么都没留下…
展开
-
51nod 1880 单词究错(模拟)
51nod 1880 单词究错题目:给你 n 个字符串当词典, 还有 m 个字符串当作查询,每次查询输出字典中与当前询问字符串差一个字符不一样的字符串(增加,减少,修改)。分析:模拟水题,直接暴力枚举即可。只不过做这个题时 oj 一直报错,最后才发现有个返回值为 int 的函数没有写返回语句导致 wa。记录一下。#include <bits/stdc++.h>using n...原创 2019-11-07 21:55:35 · 258 阅读 · 0 评论 -
51nod 1091 线段的重叠 (贪心)
51nod 1091 线段的重叠题目给出 nnn 条线段,问任意两条线段最大重叠区间长度。n<5e4n < 5e4n<5e4分析贪心,先按起点升序,终点降序排序,之后扫一遍所有区间。由于按起点升序,所以后面的区间起点一定小于前面的,因此对于当前区间,维护出现过的最远右端点 pospospos,考虑吧 pospospos 与当前区间的相对位置跟新答案即可。#include...原创 2019-11-01 18:45:56 · 215 阅读 · 0 评论 -
51nod 2006 飞行员配对(二分图最大匹配,)
题目分析裸匈牙利算法存储:邻接表+dfs#include <bits/stdc++.h>#pragma GCC diagnostic error "-std=c++11"#define d(x) cout << (x) << endl#define INF 0x3f3f3f3f#define eps 1e-8using namespace st...原创 2019-05-11 17:01:12 · 199 阅读 · 0 评论 -
51nod 1001数组中等于k的数对
题目给n个不重复的数,问有多少数对和等于k分析两种方法对于每一个都二分找两头逼近找数对#include <bits/stdc++.h>#pragma GCC diagnostic error "-std=c++11"#define d(x) cout << (x) << endl#define INF 0x3f3f3f3f#define ...原创 2019-05-12 08:40:56 · 138 阅读 · 0 评论 -
51nod1042 数字0-9的数量(数位dp or 模拟)
1042 数字0-9的数量题目分析两种做法,数位dp,这种比较好理解还有迭代模拟其实两种思想都一样,想好三点,(例 2048)当前数字 e 是 204 时:当前数字个位对个位影响204 % 10 = 4【0,4】加上 s当前数字高位对个位影响204 / 10 = 20【0, 9】加上20 * s当前数字个位对高位影响【2】加上 s * (4 + 1)【0】加...原创 2019-05-25 21:50:10 · 294 阅读 · 0 评论 -
51nod-1021 石子归并(区间dp入门)
题目给出n堆石子,两堆相邻的可以合并,花费为合并后的石子数。求最终合并成一堆要花费最小代价。分析区间dp,顾名思义,就是解决一些区间内最优值的问题,通常的时间复杂度为n^2 或者 n^3而区间dp的大致思路就是首先确定状态初始化dp数组的值,然后枚举区间长度,枚举区间的起始点,(有的题目还需要枚举断点) 由小区间转移到大区间。最后dp[1][n]往往就是答案。这个题,s代表区间始点,...原创 2019-05-22 11:34:25 · 295 阅读 · 0 评论 -
51nod-2522 和为K的倍数 (玄学TLE?)
51nod-2522 和为K的倍数玄学tle最近做了这道水题,发现我把统计数量的变量ans设为全局变量,就会TLE。设为局部变量才能过,这是什么意思?????难搞哦下两组代码只有ans 初始化位置不同,一个t,一个ac①:t#include <bits/stdc++.h>using namespace std;typedef long long ll;const in...原创 2019-05-22 21:13:23 · 404 阅读 · 2 评论 -
51nod - 1035 最长的循环节(数论)
51nod - 1035 最长的循环节题目给一个n,(10<= n <= 1000),求小于n的数num,1/num1/num1/num化成小数循环节长度最大的num。分析定理:如果1<=b<a1 <= b<a1<=b<a,a没有2或5的质因子,并且a与b互质,那么b/ab/ab/a的循环节位数恰好等于使...原创 2019-05-22 22:09:21 · 311 阅读 · 0 评论 -
51nod-1043 幸运号码(数位dp)
51nod-1043 幸运号码题目分析数位dp用dp[i][j] 表示长度为 i,和为 j 的所有情况(包含前导零)。状态转移方程:dp[i][j]=∑dp[i−1][j−k](0<=k<=9)dp[i][j] = \sum{dp[i-1][j-k]} (0 <= k <= 9)dp[i][j]=∑dp[i−1][j−k](0&...原创 2019-05-27 22:08:25 · 377 阅读 · 0 评论 -
1051 最大子矩阵和(dp)
1051 最大子矩阵和题目分析这题用 n3n^3n3的复杂度过的,很暴力。对于大矩形,枚举左右边界,之后转化为最大字段和做。例:1 2 34 5 67 8 9枚举左右边界为:1, 2就变为求 3, 9, 15 的最大字段和#include <bits/stdc++.h>#define INF 0x3f3f3f3f#define d(x) cout <&...原创 2019-05-27 22:41:26 · 203 阅读 · 0 评论 -
2486 小b和矩阵(dfs水题)
2486 小b和矩阵题目顺时针螺旋输出矩阵分析水题,定义好顺时针方向顺序,每次dfs从上次的方向开始走。#include <bits/stdc++.h>#define INF 0x3f3f3f3f#define d(x) cout << (x) << endl#define lson l, m, rt<<1#define rson ...原创 2019-05-28 10:30:21 · 224 阅读 · 0 评论 -
2517 最少01翻转次数(水题,前后缀)
51nod-2517 最少01翻转次数题目分析最终要变成k左边全0,右边全1。现在要找到k,即k左边1数量,右边0数量,最小。预处理下1前缀和,0后缀和。#include <bits/stdc++.h>#define INF 0x3f3f3f3f#define d(x) cout << (x) << endl#define lson l, m...原创 2019-05-28 11:19:21 · 3111 阅读 · 0 评论 -
51nod-1258 序列求和 V4(拉格朗日插值法)
51nod-1258 序列求和 V4题目题目给出n,kn, kn,k ,让求S(n)=∑i=1nikS(n) = \sum_{i=1}^{n} i^{k}S(n)=∑i=1nik。(n<1e18,k<5e4)(n < 1e18,k<5e4)(n<1e18,k<5e4)可以看出 SSS 函数是自然数幂的前缀和,并且数据非常...原创 2019-06-07 18:32:27 · 729 阅读 · 0 评论 -
51nod-2621 树上距离(tarjian离线求LCA)
51nod-2621 树上距离题目求树上两点最短距离,q次查询分析按有向树存,选出一个根节点。首先预处理节点到根节点的距离 disdisdis,用 tarjian离线求询问两点的LCA。最后套结果 dis(u,v)=dis[u]+dis[v]−2∗dis[LCA]dis(u, v) = dis[u] + dis[v] - 2 * dis[LCA]dis(u,v)=dis[u]+dis[...原创 2019-06-20 22:08:16 · 365 阅读 · 0 评论 -
51nod-2602 树的直径(最远点对)
51nod-2602 树的直径题目给出一颗 n 个节点的树,求树上最远点对。分析用 dp[i]dp[i]dp[i] 维护以 i 为根的子树的深度,dp[i]=max(dp[i],dp[j]+1)dp[i] = max(dp[i], dp[j]+1)dp[i]=max(dp[i],dp[j]+1)(j 为 i 的儿子)。求出任意节点 i 子树深度之后,经过 i 的最长路径就是最深的两颗子树...原创 2019-06-21 16:20:52 · 477 阅读 · 0 评论 -
51nod- 2619 三个好朋友(裸哈希)
51 nod-2619 三个好朋友题目首先有一个字符串 S,两个S拼接变成字符串 T,接着在 T 中插入一个字符变成了字符串 U。题目给出 U串,求是否存在原 S串。输出一行,若S不存在,输出"NOT POSSIBLE".若S不唯一,输出"NOT UNIQUE".否则输出S。分析想暴力思路,对于每一位都假设是添加进去的,模拟删除之后两个字符串的左右是否相同。复杂度 O(n^2)。复杂度...原创 2019-06-21 22:05:36 · 566 阅读 · 0 评论 -
51nod 2599 最近公共祖先(LCA) (ST表求LCA模板)
51nod 2599 最近公共祖先(LCA)题目裸 LCA,给一颗 n 个节点, n-1 条边的树,m次查询求任意两点LCA。算法介绍求 LCALCALCA 可以用离线 TarjianTarjianTarjian算法,算法复杂度O(n + m)。还有一种离线的算法,预处理O(nlogn),在线查询O(1)。就是用STSTST表求LCA。首先介绍欧拉遍历序,给一颗树,从根节点遍历:欧...原创 2019-06-26 16:25:11 · 719 阅读 · 0 评论 -
51 Nod 2485 小b重排字符串
题目小b有一个字符串S,全部为小写字母,现在她希望重排列S,使得S中相邻字符不同。请你判断小b是否可能成功。样例解释:将"aab"重排为"aba"即可。分析找到出现次数最大的次数k,设字符串长度为n。如果n为偶数数,那么k最大为 n/2。如果n为奇数,那么k 最大 为 n/2+1。超过的话就不合格#include <bits/stdc++.h>#pragma GCC...原创 2019-05-15 21:57:08 · 510 阅读 · 0 评论 -
计算几何之线段相交(51nod1264)
解法一:设两线段端点P(p1, p2), Q(q1, q2),分两步确定两线段是否相交快速排斥实验设以线段 P1P2 为对角线的矩形为 R,设以线段 Q1Q2 为对角线的矩形为 T,若 R、T 不相交,则两线段不可能相交假设 P1 = (x1, y1), P2 = (x2, y2), Q1 = (x3, y3), Q2 = (x4, y4),设矩形 R 的 x 坐标的最小边界为 min...原创 2019-05-07 22:25:03 · 362 阅读 · 0 评论 -
1240 莫比乌斯函数(单值求解)
题目要求给出一个数n,求莫比乌斯函数值miu(n)。分析因为题目给出单个值,直接求miu函数即可。#include <bits/stdc++.h>#pragma GCC diagnostic error "-std=c++11"#define d(x) cout << (x) << endl#define INF 0x3f3f3f3f#defin...原创 2019-05-10 12:00:40 · 598 阅读 · 0 评论 -
51nod 1049 最大子段和
1049最大子段和基准时间限制:1秒 空间限制:131072KB 分值:0难度:基础题收藏关注N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。Input&l...原创 2018-10-15 22:03:53 · 152 阅读 · 0 评论 -
51nod1006最长公共子序列LCS
输出路径的过程结合dp数组和代码一看就懂了 a b d k s c a ba 1 1 1 1 1 1 1 1 b 1 2 2 2 2 2 2 2 c 1 2 2 2 2 3 3 3 i 1 2 2 2 2 3 3 3 c 1 2 2 2 2 3 3 3 b 1 2 2 2 2 3 3 4 a 1 2 2 2 2 3 4 4 经典的dp题,关键题目让输出最后的公共序列,可以...原创 2019-04-05 22:30:43 · 254 阅读 · 0 评论 -
斯特林公式应用
51nod1058这题让求n的阶乘长度,n范围到1e6,很明显会爆long long,那么就需要一个公式直接算出结果–斯特林公式,这个公式的作用就是求n阶乘的近似值。我们知道求一个十进制数x的位数,log10(x) + 1,用斯特林公式带入x,两边取对数可以看出斯特林公式的作用,上式左边n!会爆,而右边的每一项都不会爆long long,因为取了对数。这样就可以算出位数了。提一下cm...原创 2019-04-21 10:49:46 · 2231 阅读 · 0 评论 -
51nod 1134 最长递增子序列
分析:LIS模板题,注意要用nlog(n)nlog(n)nlog(n)的dp,即dp[i]代表长度为i的LIS序列最小结尾值。#include <bits/stdc++.h>#define INF 0x3f3f3f3f#define d(x) cout << (x) << endl#pragma GCC diagnostic error "-std=c...原创 2019-04-25 20:04:44 · 191 阅读 · 0 评论 -
原根详解
什么是a模m的阶?设m>1,gcd(a,m)=1,使得ar≡1(modm)a^{r} \equiv 1 \pmod {m}ar≡1(modm)成立的最小的r,称为a对模m的阶。性质:如果一个数有原根,那么它一共有φ(φ(m))\varphi(\varphi(m))φ(φ(m))个原根。如果p为素数,那么素数p一定存在原根,并且模p的原根的个数为φ(p−1)\varphi(p-1)φ...原创 2019-04-25 22:32:19 · 6972 阅读 · 0 评论 -
ST表算法总结
RMQ问题RMQ (Range Minimum/Maximum Query):对于长度为n的数组A,回答若干询问RMQ(A,i,j)(i,j<=n-1),返回数组A中下标在i,j范围内的最小(大)值,即求解区间最值求解方法线段树 预处理O(n) ~ 查询O(log(n)) ST(Sparse Table)表(本质dp)预处理O(nlog(n)) ~ 查询O(1),不支持在线修...原创 2019-04-26 12:01:02 · 497 阅读 · 0 评论 -
最小编辑距离
51nod1183编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:sitten (k->s)sittin (e->i)sitting (->g)所以kitten和si...原创 2019-04-26 22:12:41 · 340 阅读 · 0 评论 -
扩展欧几里得算法(推导,逆元)
欧几里得算法欧几里得算法又称为辗转相除法,是为了计算两个数的最大公约数。定理:gcd(a,b)=gcd(b,amod  b)(a>b)gcd(a, b) = gcd(b, a\mod b ) (a> b)gcd(a,b)=gcd(b,amodb)(a>b)证明:假设a>ba &g...原创 2019-04-27 22:02:28 · 1222 阅读 · 0 评论 -
约瑟夫环问题(递推公式)
基本问题描述:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。(也类似于变态杀人狂问题)通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。通常,我们会要求输出最后一位出列的人的序号。那么这里主要研究的是最后一个出列的人的序号要...原创 2019-04-23 18:06:28 · 3528 阅读 · 0 评论 -
中国剩余定理
中国剩余定理(限制条件:模为两两互质)中国剩余定理其实很早我们都接触过,在初中甚至小学的时候我们都有可能看到过这样的问题:有n个东西,三个人分剩两个,五个人分剩三个,七个人分剩两个,求n最少是多少。求解这个问题古人就已经想到了很好的解决办法。我们由题意易知:x=2(mod)3;x=3(mod)5;x=2(mod)7;如果x=n1+n2+n3。n1是5,7的倍数,且n1%3=2。n...原创 2019-04-23 19:55:36 · 479 阅读 · 0 评论 -
51nod - 1057 N的阶乘(大数乘法)
题目题意:给你一个数n,求n阶乘,(n < 1e4)分析:用普通类型肯定会爆,我们把结果的数字分段,例如8个一段,用一个整型表示,在求阶乘时,把每一段分别与i相乘,然后模拟进位,最后注意最左边的一段不需要填充0,其他的段要在左边填充0。#include <bits/stdc++.h>#pragma GCC diagnostic error "-std=c++11"#de...原创 2019-04-19 22:01:57 · 205 阅读 · 0 评论 -
51nod1118 机器人走方格 (组合数学模板)
题意: 有一矩形n * m,从左上走到右下有多少种走法分析:首先可以明确,水平要走m-1格,竖直要走n-1格,则走到目的地的任意一条路径必须走n+m-2格,只要确定竖直要走的,剩下的就是水平要走的,则答案为费马小定理#include <bits/stdc++.h>#define INF 0x3f3f3f3f#define d(x) cout << (x) <...原创 2019-04-24 22:38:29 · 284 阅读 · 0 评论 -
51nod 1002 数塔取数问题
题目求从第一层走到最低一层经过权值最大多少分析状态转移:dp[i][j] += max(dp[i-1][j], dp[i-1][j-1]可以用一个pre数组存一下dp[i-1][j-1],空间优化。#include <bits/stdc++.h>#pragma GCC diagnostic error "-std=c++11"#define d(x) cout <&...原创 2019-05-13 19:56:32 · 154 阅读 · 0 评论 -
四点共面51nod 1265
分析四个点组成三个向量,若三个向量混合积为0,则证明向量共面。混合积:https://baike.baidu.com/item/混合积/10564182?fr=aladdin混合积可以用行列式来计算[a.x a.y a.z][b.x b.y b.z][c.x c.y c.z]#include <bits/stdc++.h>#pragma GCC diagnostic e...原创 2019-05-08 22:32:31 · 330 阅读 · 0 评论 -
51nod 1298圆与三角形(判断线段与圆相交)
题目给三角形三个点,圆心,半径,问三角形圆是否相交?分析三点在圆内,不相交三点在圆外,要考虑判断剩下的情况都相交三点在圆外时,只需判断三条线段是否与圆相交,若有一条相交,输出Yes转化为线段与圆相交,在端点都在圆外情况下。先用判断圆心到线段所在直线距离,只能小于半径。然后用判断圆心与两端点角度是否为锐角。代码#include <bits/stdc++.h>...原创 2019-05-09 21:14:52 · 335 阅读 · 0 评论 -
51nod 1284 2 3 5 7的倍数(容斥原理)
题目题目意思很简单, 求1到n中有多少数不是2, 3, 5, 7的倍数,n范围到 1e18。分析两个知识点解决:1 到 n 中,能被c整除的数的个数为 n/cn/cn/c容斥原理。首先算有多少是2,3, 5, 7的倍数。num(x)表示都多少是x倍数:容斥原理:num(2+3+5+7)=num(2)+num(3)+num(5)+num(7)−num(23)−num(25)−num...原创 2019-05-14 21:09:37 · 305 阅读 · 0 评论 -
51nod-1007正整数分组(简单dp)
传送门1007 正整数分组基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注将一堆正整数分为2组,要求2组的和相差最小。例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。Input第1行:一个数N,N为正整数的数量。第2 - N+1行,N个正整数。(N &amp;amp;lt;= 100, 所有正整数...原创 2018-10-23 21:41:11 · 261 阅读 · 0 评论