51Nod-题解集锦
文章平均质量分 53
大一下学期开始刷 51Nod,一年有余,做了不少等级低的题,或多或少的也写了题解,不算好,也不算太差吧~~~
f_zyj
一个追逐蝴蝶的人!
展开
-
51Nod-1946-特殊表示法
ACM模版描述题解首先我们来分析一下斐波那契数列的基本性质,众所周知,斐波那契数列从第二项开始后,能够组合(每一项只有选与不选两种操作)出来任意自然数,所以才会有这个特殊表示法的存在,并且这个表示法里不存在任意两个连着的 11,因为一旦存在就可以转化为另一个数,毕竟 fib[i]=fib[i−1]+fib[i−2]fib[i] = fib[i - 1] + fib[i - 2],如果 i−1i -原创 2018-01-01 20:28:34 · 614 阅读 · 1 评论 -
51Nod-1805-小树
ACM模版描述题解最近懒了好多,51Nod51Nod 也好久没有添加题了,所以到今天才发现 CSDNCSDN 编辑中心改版了,感觉还挺有趣的,但是编辑区太小了,不知道会不会不适应。直接给一下官方题解吧!话说,第二类斯特灵数是啥子?不是斯特林吗?不过这个题网上有大佬提到了 pruferprufer 序列,好像有着密切的关联,毕竟这些树都在空中漂浮不在地面着根。代码原创 2018-01-05 18:28:48 · 616 阅读 · 0 评论 -
51Nod-1981-如何愉快地与STL玩耍
ACM模版描述题解线段树 + bitsetbitset + 二分 + 输入外挂 + 输出外挂 + Visual C++\text{Visual C++}……运气好可以卡过!代码#include #include #include #include using namespace std;const int MAXN = 65540;const原创 2018-01-05 19:15:14 · 1039 阅读 · 3 评论 -
51Nod-1995-三子棋
ACM模版描述题解仔细读题,运行代码出奇迹~~~代码#include <iostream>using namespace std;int main(int argc, const char * argv[]){ int T; cin >> T; int x, y; while (T--) { cin >> x >> y; swi原创 2017-12-10 12:58:07 · 979 阅读 · 4 评论 -
51Nod-1874-字符串排序
ACM模版描述题解很简单的一个逆序数问题,不过因为一个坑点,WAWA 了好几发,一开始把 nn 和 mm 看反了……代码#include <iostream>#include <algorithm>#include <cstring>#include <string>using namespace std;/* * 也可以用树状数组做 * a[0...n - 1] cnt = 0; c原创 2017-12-10 13:35:55 · 550 阅读 · 0 评论 -
51Nod-2020-排序相减
ACM模版描述题解还是那句话,这种题不该出现在 51Nod51Nod 题库,就算出现也不该是基础题,应该是 11 级题,和基础题的定位不符。代码#include <iostream>#include <algorithm>using namespace std;const int MAXAB = 4;int n, k;int a[MAXAB], b[MAXAB];bool cmp(const i原创 2017-12-10 13:09:18 · 770 阅读 · 2 评论 -
51Nod-1849-Clarke and package
ACM模版描述题解官方题解:代码#include <iostream>#include <algorithm>#include <cstdio>using namespace std;const int MAXN = 3000;const int MAGIC_I = 10000;const double MAGIC_D = 0.0001;template <class T>inline v原创 2017-12-09 13:55:16 · 462 阅读 · 0 评论 -
51Nod-1868-彩色树
ACM模版描述题解树型DP,先上官方题解:官方题解说的十分清楚,和我的代码思路也恰好吻合,大体上是针对每种颜色求出不包括该种颜色的路径的点对儿数目之和。最后用 col_num∗cal(n)col\_num * cal(n) 减去前边求的和即为树上任意不同两点之间路径包含的颜色种类之和,然后再乘以 (n−1)!(n - 1)! 即可。总得来说就是一个逆向思维的树型DP,要直接求任意不同两点之间路径包含原创 2017-12-10 02:22:25 · 805 阅读 · 0 评论 -
51Nod-1650-穿越无人区
ACM模版描述题解由: |x+y|≡0 mod (2∗a)|x + y| \equiv 0\ mod\ (2 * a) |x−y|≡0 mod (2∗b)|x - y| \equiv 0\ mod\ (2 * b) 可得, x+y=n∗(2∗a)x + y = n * (2 * a) x−y=m∗(2∗b)x - y = m * (2 * b)此时,画一下图就很容易发现,沼泽都是连在一起的,并原创 2017-12-09 00:57:08 · 379 阅读 · 0 评论 -
51Nod-2000-四边形分割平面
ACM模版描述题解一开始脑子卡死了,想着两个四边形最多只能分成 44 个,后来大佬提示我同心旋转 4545 度,然后秒懂……╮(╯▽╰)╭哎,脑子不够用了,这么简单的一个规律题都懵逼。代码#include <iostream>using namespace std;long long n;int main(int argc, const char * argv[]){ int T;原创 2017-12-10 13:53:06 · 899 阅读 · 0 评论 -
51Nod-1835-完全图
ACM模版描述题解最近懒了好多,写题少了好多,闲来无事水一发……DPDP 问题,设 dp[i][j]dp[i][j] 表示前 ii 个点形成 jj 个连通块的方案数,具体细节看官方题解吧,不难理解。懒得写 LatexLatex 表达式了……代码#include <iostream>using namespace std;typedef long long ll;const int MOD = 998原创 2017-12-07 14:19:08 · 890 阅读 · 0 评论 -
BSG白山极客挑战赛-A-数数字
统计一下 aaa ⋯ aaan个a × b 的结果里面有多少个数字d,a,b,d均为一位数。 样例解释: 3333333333*3=9999999999,里面有10个9。Input 多组测试数据。 第一行有一个整数T,表示测试数据的数目。(1≤T≤5000) 接下来有T行,每一行表示一组测试数据,有4个整数a,b,d,n。 (1≤a,b≤9,0≤d≤9,1≤n≤10^9) Ou原创 2016-05-20 21:30:37 · 784 阅读 · 0 评论 -
51Nod-1001-数组中和等于K的数对
ACM模版描述题解这道题两种办法解,两种办法的通性是都需要排序,但是数据结构截然不同。 第一种办法是源数据进行从小到大排序,然后定一个哨兵flag,来卡住查找的范围,以此来达到减少查找次数。 第二种办法比较巧,将复杂度为O(n*m)降低为O(n)。效率略微提高,使用的手段是将数据结构改造了一下,给源数据捆绑了一个antival的辅助数据。当a[i].val < k / 2时,a[i].antiv原创 2016-07-30 03:51:40 · 733 阅读 · 0 评论 -
51Nod-1090-3个数和为0
ACM模版描述题解数据比较水,复杂度为O(n^3)一样可以过。但是想要优化起来比较麻烦,细节问题挺多的。代码#include <iostream>#include <algorithm>using namespace std;const int MAXN = 1010;int A[MAXN];int main(int argc, const char * argv[]){// freop原创 2016-07-30 23:37:48 · 926 阅读 · 0 评论 -
51Nod-1091-线段的重叠
ACM模版描述题解先进行排序,然后互相比较,留最长。然而单纯地互相比较会在最后几组数据超时,所以需要进行一个小小的优化,L[j].y > L[i].y时,直接跳出i与后续的j的比较。如此,AC之……代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int MAXN = 5e4 +原创 2016-07-31 00:55:42 · 457 阅读 · 0 评论 -
51Nod-1107-斜率小于0的连线数量
ACM模版描述题解常规解法是逆序数(也可以使用树状数组解),注意横坐标相等的情况。代码One:#include <iostream>#include <algorithm>#include <cstdio>using namespace std;const int MAXN = 5e4 + 10;long long ans = 0;struct line{ int x; int原创 2016-08-20 19:20:56 · 722 阅读 · 0 评论 -
51Nod-1243-排船的问题
ACM模版描述题解万万没想到,这道题用的是二分……对绳子长度进行二分,然后逐个对比,看能否排放下所有船只,绳子长度在0~M-1之间,所以……顺理成章的二分,只是查找的不是v,而是长度为mid的绳子能否拴住所有的船,这里我们用int judge(int d)函数来判断,如果能拴住,则说明最长绳子的长度最短小于等于d,否则大于等于d,可AC……代码#include <iostream>#include原创 2016-08-28 18:27:19 · 884 阅读 · 4 评论 -
51Nod-1366-贫富差距
ACM模版描述题解并查集+Floyd算法~根据题意,无穷大的情况连通块儿一定超过1个,所以先用并查集过一遍,如果是一个连通块儿,那么再用Floyed算法,求任意两点之间的最短距离,默认每条路径长度为1,最后从所有距离中查找最大的距离,乘以d即为结果。代码#include <iostream>#include <cstring>#include <cstdio>using namespace st原创 2016-09-13 01:47:06 · 827 阅读 · 0 评论 -
51Nod-1487-占领资源
ACM模版描述题解一开始,没想到啥好主意,直接暴力(One),TLE了一半,好心酸,越往后做,越发现51Nod对效率的不懈追求!!!最后,因为知识匮乏,所以,只好找了大牛的题解,找到了qwb的博客,讲了一种利用RMQ预处理后复杂度为O(n * m * log(n * m))的解法(Two),感觉十分有趣,开发思维啊这题~~~先预处理每一个塔所能得到的最多资源, 然后枚举第一个塔的位置,那么第二个塔原创 2016-09-28 14:28:54 · 537 阅读 · 0 评论 -
51Nod-1557-两个集合
ACM模版描述题解我用的方法复杂度是 O(nlogn),快排+二分,思路挺简单,但是容易漏,要想全才行。这个问题也就是数对儿问题,x+pA=a 或者 x+pB=b。首先,我们只用分析 NO 的情况,其他的都是 YES,NO 的情况有两种: One:x 既不在 A 中,也不在 B 中,即找不到 a-x 和 b-x,NO; Two:x 既可以在 A 中,也可以在 B 中,也就是找到了 a-x 和原创 2017-03-06 23:04:24 · 643 阅读 · 0 评论 -
51Nod-1158-全是1的最大子矩阵
ACM模版描述题解这个问题其实和普通的求最大子矩阵相仿,不过在判断是否可以构成矩阵时需要进行特别的判断,A[j][k] - A[i - 1][k] != j - i + 1,为真,则需要进行重置,否则,进行cnt++。但是这个问题还有更加高级的解法,可以用单调栈做,不过个人感觉有些复杂,这里只提供最简单的解法,也就是最大子矩阵解法。如果矩阵再大一些,那就只能用单调栈搞事情啦。也许还有别的方法,那我就原创 2017-03-20 18:27:01 · 702 阅读 · 0 评论 -
51Nod-1204-Parity
ACM模版描述题解这个问题我想半天也没想到怎么和并查集挂上钩了,看来是我并查集太弱了,找了找题解才搞懂了,但是感觉网上的题解前篇一律,开头讲的很容易懂,但是后边到为什么要开两倍大小的数组讲的却不是那么容易理解,所以我就按照我自己的理解再写一下吧,权当补充吧,如果我的理解错了,烦请众神拍砖~~~首先,我们知道如果 [left, right] 为even,那么说明这里有偶数个1,所以可以判定,[1, l原创 2017-04-02 02:46:28 · 574 阅读 · 2 评论 -
51Nod-1467-旋转绳
ACM模版描述 题解这个题倒是不难,主要就是二分,并不像平时做的那种海量查询的问题那样,需要预处理优化、线段树优化之类的。一开始看到数据这么大,访问次数这么多,就感觉是需要预处理的,可是想半天也没有想到怎么处理,后来发现是二分,感觉很出乎意料,二分竟然能过,写好后提交了两次超时了,因为这个题卡 I/O 了,加上输入和输出外挂后,顺利 AC,只用了 300+ms300+ms 就过了,这个代码在 1原创 2017-07-01 22:47:09 · 384 阅读 · 0 评论 -
51Nod-1711-平均数
ACM模版描述题解二分答案,数据结构用树状数组比较好,期间需要离散化一下下。这里给了 4s4s 时限,有些多了,应该是需要注意一下输入优化的。这里我们先求一下前缀和 sum[]sum[] 和最大值 mxmx,然后二分,核心是 check()check(),需要用到树状数组 + 离散化。至于树状数组用来处理什么呢?我们可以推出如下: 二分过程我们需要 check(m)check(m),所以需要求有原创 2017-07-03 16:54:11 · 330 阅读 · 0 评论 -
51Nod-1525-重组公司
ACM模版描述题解典型的并查集问题,由于需要区间更新,所以这里要维护一个 pre[]pre[] 数组,表示当前记录点与在它前边且最靠近它的不同部门的点。代码十分容易理解,就不再赘述了。代码#include <iostream>#include <cstdio>using namespace std;const int MAXN = 2e5 + 10;int n, q;int fat[MAXN];原创 2017-07-10 17:06:24 · 441 阅读 · 1 评论 -
51Nod-1681-公共祖先
ACM模版描述题解第一次接触主席树,感觉好叼好叼,无法驾驭它啊~~~贴一下官方题解吧: 貌似,这里用树状数组维护也是可以的啊……当然,我并不会。水平太臭了!代码#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAXN = 1e5 + 10;const int MAXM =原创 2017-07-10 19:40:04 · 402 阅读 · 0 评论 -
51Nod-1533-一堆的堆
ACM模版描述 题解离线处理,先将数据离散化,也就是根据 aa 排序即可。因为要维护 kk 叉最小堆,所以我们需要从小到大进行处理,加入树状数组中,先一遍循环访问这些结点的孩子所在区间有多少不合法,然后再将这些结点插入,以此而往,这里需要强调的是,这些指的不是所有,而是值一样的结点, 将所有值一样的结点分批次处理,也就是一个循环的问题,访问完一批添加一批而已。这里需要说的是,对于树状数组,我们要求原创 2017-07-26 22:22:49 · 422 阅读 · 0 评论 -
51Nod-1515-明辨是非
ACM模版描述题解这里主要涉及到相等和不相等以及不确定关系三种,初始化全部是不确定关系,通过 nn 组操作对其进行修改,所有有效操作(YESYES)都会改变其不确定性关系,那么我们可以通过两种数据结构来表示这关系,相等的关系很容易想到,就是并查集,相等的我们并入一个并查集即可,那么不相等关系我们可以通过 setset 来维护,这样我们就可以充分的表现任意两者之间的关系了。另外这里需要用到离散化,也就原创 2017-08-11 15:50:54 · 560 阅读 · 0 评论 -
51Nod-1295-XOR key
ACM模版描述 题解第一次知道原来可持久化并不只是主席树的专利……TireTire 也可以持久化操作……学习了。原谅我对可持久化理解的不够深刻,目前还只是套套模版的样子……至于为什么要用 TireTire 倒是十分容易理解,这种求 XorXor 最大的题,需要从高位贪心处理,尽量找高位不同的数,找不到向低位继续查找,我们将它桉位拆开看,就是一个 TireTire 树了。很好的一个题,可惜我对可持久原创 2017-08-11 18:11:59 · 613 阅读 · 0 评论 -
51Nod-1685-第K大区间2
ACM模版描述题解二分 + 树状数组。二分枚举答案,判断中位数大于等于当前答案的个数是否足够 kk 个,至于怎么判断,我们需要借助树状数组。首先我们可以通过前缀的方法获取前 ii 个数字有几个大于 mm 的,这里的 mm 是我们枚举的答案,然后我们可以知道,我们需要求得是 sum[j]−sum[i−1]>j−i2,j≠isum[j] - sum[i - 1] > \frac{j - i}{2}, j原创 2017-08-12 15:32:15 · 473 阅读 · 0 评论 -
51Nod-1249-近似有序区间
ACM模版描述题解这个题用线段树可解,奇思妙想啊~~~首先我们可以很容易理解的是,SS 序列的图像可以抽象为锯齿状,我们需要将注意力放在上齿,例如:S=1,2,3,2,3,4,1,2,5S = {1, 2, 3, 2, 3, 4, 1, 2, 5},这里的 1,2,3、2,3,4、1,2,5{1, 2, 3}、{2, 3, 4}、{1, 2, 5} 就是上齿。然后我们需要考虑将这个序列分解为 NN原创 2017-09-25 07:40:06 · 608 阅读 · 0 评论 -
51Nod-1203-JZPLCM
ACM模版描述题解这个题的解法好像好多好多,可以线段树解,自然也可以用树状数组解,还有大佬直接莫队推过,我这里用的树状数组搞得。首先将数进行拆解,拆成素数积的形式,每次访问时,都需要获取该区间所有出现过的素数所出现的最高次,这些数的乘积便是答案。这里我们应该进行离线操作,将所有的访问都进行排序,维护每一个特征值下一个相同的位置,从左向右扫描一遍,解决每个点作为左端点的询问。大致就是这样,很好的一个题原创 2017-09-26 17:36:48 · 371 阅读 · 0 评论 -
51Nod-1208-Stars in Your Window
ACM模版描述题解线段树 + 扫描线。把星星转化为矩形,把矩形转化成线段,然后求哪一条线段权值最大。具体的思路可以看看 光速小子0511’s blog,太强啦~~~代码#include <iostream>#include <algorithm>#include <map>#define lson (root << 1) + 1#define rson (root << 1) + 2using原创 2017-09-28 18:49:34 · 462 阅读 · 0 评论 -
51Nod-1618-树或非树
ACM模版描述 题解这是 CFCF 上的一道原题,没有啥思路,于是找来一下题解,找到了一个远古的博客(jasonzhu8’s blog),里面有这个题的题解,然而他的代码写得实在让我难受,并且有一点我不是特别理解,但是依然是大佬。大佬题解:这个题解的第一句我无法理解,题目中说给定一个 nn 点 nn 边的无向图,可是并没有说是 一棵树 + 一条边 啊,这么强的条件,我不理解该大佬从何悟出,难道说是原创 2017-09-29 16:56:33 · 518 阅读 · 3 评论 -
51Nod-1029-大数除法
ACM模版描述题解这种题除了用 java(代码 One) 外,我就只会套模版(代码 Two)了,写起来贼累,当然,模版出奇迹!代码One:import java.math.BigInteger;import java.util.Scanner;public class Main { private static Scanner cin; public static void main原创 2017-08-06 02:42:16 · 851 阅读 · 3 评论 -
51Nod-1562-玻璃切割
ACM模版描述题解这是一道 CF 的题,很明显我们需要求得是横向纵向每个状态下的最大值,然后相乘即为结果,这个题运气好的话有两种解法儿,运气不好的话,我就知道一种。因为51时限比较严格,不仅卡了 IO,还卡了运气,第一种办法用 set 集合(代码 One)搞搞,但是不幸的是,总是有一组超时,评论区有一个大神说他多提交几次迷之闪过,我想,大概他用的就是这个方法,而我却没有那么好的人品,提交了七八次,时原创 2017-04-01 00:24:14 · 1398 阅读 · 4 评论 -
51Nod-TalkingData数据科学精英夏令营挑战赛-D-数据流中的算法-众数
ACM模版描述题解map+set 搞搞就行了,用 map 打标签,用 set 返回某时某刻的最大值,另外用一个数组 pass 记录网页,相当于队列,如果全部用 STL 应该也是可以过的,不过这里注意要加上输入和输出两个外挂,平时我比较习惯只加输入,可是挂了,超时一组,后来我加上两个外挂后,875ms875ms 顺顺利利通过!代码#include <iostream>#include <stdio.原创 2017-06-18 01:07:39 · 546 阅读 · 0 评论 -
51Nod-1394-差和问题
ACM模版描述题解快排 + 离散化 + 两个树状数组搞搞,分别用于表示数的个数与数的和,这里的核心是添加和删除过程中绝对值之和的变化,假如当前加入的数为 x,比 x 小的数有 cnt 个,总和为 sum,那么添加 x 的过程这一部分对绝对值之和的影响为 x∗cnt−sumx * cnt - sum,对于比 x 大的数这一部分同理,删除时亦然。这里需要注意的是输入输出优化,另外最好用 <stdio.h原创 2017-06-20 15:49:43 · 363 阅读 · 0 评论 -
51Nod-1586-约数和
ACM模版描述 题解为什么我感觉这个题加不加输入输出外挂没啥两样呢?都是 1300ms1300ms 左右 AC……先预处理一下每个数的约数个数,然后直接暴力就好了。代码#include <cstdio>using namespace std;typedef long long ll;const int MAXN = 1e6 + 10;int n, q;int cnt[MAXN];ll a[MA原创 2017-07-04 19:14:59 · 461 阅读 · 0 评论 -
51Nod-1573-美丽的集合
ACM模版描述题解这个题真是鬼斧神工,让我再一次见识到了 bitsetbitset 的神奇威力……利用并查集来处理集合并的问题,然后暴力手段合并两个集合的元素,并且用 bitsetbitset 来处理和的种类数,这里十分巧妙,首先将原本的所有和全部加上新加入的元素形成新的和,然后与原本的和种数合并在一起即可。很好玩的一个题,没想到 bitsetbitset 操作竟然如此清真(其实我并不知道清真啥子梗原创 2017-10-08 12:12:17 · 498 阅读 · 0 评论