
51nod
CHN_JZ
爆0 forever
展开
-
[状态压缩||折半搜索]51nod 算法马拉松3 A
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2017-07-17 22:01:40 · 822 阅读 · 0 评论 -
[DP] 51 Nod 1274——最长递增路径
题目描述一个无向图,可能有自环,有重边,每条边有一个边权。你可以从任何点出发,任何点结束,可以经过同一个点任意次。但是不能经过同一条边2次,并且你走过的路必须满足所有边的权值严格单调递增,求最长能经过多少条边。 以此图为例,最长的路径是: 3 -> 1 -> 2 -> 3 -> 2 或 3 -> 1 -> 2 -> 3 -> 4 长度为4。解题思路很自然想到将边排序。 然后DP。 但是原创 2017-10-21 11:21:08 · 669 阅读 · 0 评论 -
[乱搞]51 Nod 1421——最大MOD值
题目描述有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj。解题思路对于每个数字,有n/ain/ai个区间,每个区间是[1+ai∗(k−1),ai∗k][1+ai*(k-1),ai*k]显然对于每个区间只有最接近这个区间末边界的值会更新答案。提前预处理一下就可以了。ps:我预处理有log的,其实不需要log。#inc原创 2017-10-21 11:25:15 · 742 阅读 · 0 评论 -
[容斥原理+组合数学]51 Nod 1829——函数
题目描述想知道f:A->B这个函数(其中|A|=n, |B|=m)的所有映射关系要使B的每个元素都要被A的一个元素覆盖到。数字可能很大你只要输出方案数模1,000,000,007即可。解题思路一看就是要用到容斥原理。有ii个B元素没被覆盖的方案数为Cim∗(m−i)NC^{i}_{m}*{(m-i)}^{N}容斥一下答案就出来了。#include<cstdio>#define LL long lo原创 2017-10-29 18:31:28 · 1254 阅读 · 0 评论 -
[单调队列]51 Nod 1952——栈
[单调队列]51 Nod 1952——栈题目梗概要维护一个栈。能够从栈顶和栈底加数,并能从栈顶取数。询问每次操作后栈里的最大元素。解题思路维护一个单调递减的单调队列就可以了。但是要注意统计每个元素前面有几个未删的比当前元素小的元素个数。#include<cstdio>using namespace std;const int maxn=10000005,MOD=1e9+7;int n,A,B,原创 2017-10-29 18:38:46 · 670 阅读 · 0 评论 -
[树状数组]51 Nod 1463——找朋友
题目描述给定:两个长度为n的数列A 、B一个有m个元素的集合K询问Q次每次询问[l,r],输出区间内满足|Bi-Bj|∈K 的最大Ai+Aj解题思路注意这题M的范围是10离线一下,对于每个新加的元素用树状数组暴力维护就可以了。#include<cstdio>#include<algorithm>using namespace std;const int maxn=100005;struct原创 2017-10-29 18:42:57 · 668 阅读 · 0 评论 -
[二分+最大流]51 Nod——1757 大灾变
题目描述死亡之翼降临了!艾泽拉斯大陆的子民们必须逃出他的魔爪! 艾泽拉斯的结构是一棵树,这棵树上的一些节点是地精建造的通往地下避难所的洞口。 除了这些洞口之外,树上的每个节点上都有一个种族,每个种族通过树上的一条边都需要一个单位时间。 因为地精比较矮小,所以洞口很窄,每个单位时间只能让一个种族通过,但是一个单位时间内的一个节点上可以存在多个种族。 地精们需要你求出最少需要多少单位时间才能让所原创 2017-10-22 20:38:32 · 773 阅读 · 0 评论 -
[思维题]51 Nod 1671——货物运输
题目描述公元2222年,l国发生了一场战争。 小Y负责领导工人运输物资。 其中有m种物资的运输方案,每种运输方案形如li,ri。表示存在一种货物从li运到ri。 这里有n个城市,第i个城市与第i+1个城市相连(这里1号城市和n号城市并不相连),并且从i号城市走到i+1号或者从i+1号走到i号需要耗费1点时间。 由于高科技的存在,小Y想到了一种节省时间的好方案。在X号城市与Y号城市之间设立传送原创 2017-10-23 07:34:42 · 600 阅读 · 0 评论 -
[二分+树状数组]51 Nod 1685——第K大区间2
[二分+树状数组]51 Nod 1685——第K大区间2题目描述定义一个长度为奇数的区间的值为其所包含的的元素的中位数。 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少。解题思路二分枚举答案x。考虑如何验证中位数>=x的区间总数是否>=K。构造s[i]s[i]表示前i个数有多少个数>=x>=x。如果一个区间的中位数>=x>=x肯定有(s[R]−s[L−1])∗2>R−L+1(s原创 2017-10-23 18:37:30 · 624 阅读 · 0 评论 -
[组合数学]51 Nod 1486——大大走格子
题目描述第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 2000),表示棋盘的行和列,还有不能走的格子的数目。接下来n行描述格子,第i行有两个整数ri, ci (1 ≤ ri ≤ h, 1 ≤ ci ≤ w),表示格子所在的行和列。输入保证起点和终点不会有不能走的格子。解题思路如果不考虑障碍,那么从起点走到(x,y)的方案数为Cx−1x+y−2C^{x-1}_{原创 2017-10-23 18:41:56 · 760 阅读 · 0 评论 -
[DP]51 Nod——[1048 整数分解为2的幂 V2]
题目描述给定正整数N,求N分解成若干个2的次幂的方案数。N<=1030N<=10^30解题思路之前写过O(n)O(n),看到这个数据范围瞬间就恐惧了。将N表示成一个二进制数,对于每个ai=1ai=1,都有一段区间的和刚好等于2ai2^{ai}我们考虑如何构造区间设g[i][j]g[i][j]表示前i个位置,最大数是2j2^j的方案数很快得到递推式g[i][j]+=g[i−1][k]∗f[ai−k][原创 2017-10-24 20:29:51 · 798 阅读 · 0 评论 -
[树状数组]51 Nod 1711——平均数
题目描述LYK有一个长度为n的序列a。你只要告诉他所有区间(n*(n+1)/2个区间)中第k大的平均数就行了。解题思路显然要二分,考虑如何验证。sum[R]−sum[L−1]>=x∗(R−L+1)——>sum[R]−x∗R>=sum[L−1]−x∗(L−1)sum[R]-sum[L-1]>=x*(R-L+1)——>sum[R]-x*R>=sum[L-1]-x*(L-1)那么就是求sum[i]−x∗i原创 2017-10-25 17:48:02 · 513 阅读 · 0 评论 -
[分块]51 Nod——1225 余数之和
题目梗概例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + 6 % 4 + 6 % 5 + 6 % 6 = 0 + 0 + 0 + 2 + 1 + 0 = 3。给出n,计算F(n), 由于结果很大,输出Mod 1000000007的结果即可。解题思路x%y运算其实可以看成x−x/y∗yx-x/y*y,这里的除是整除。那么对于整除x等于固定值的数我们可以一起统计,这些数显然是一个区间,我原创 2017-10-20 20:36:35 · 846 阅读 · 0 评论 -
[贪心+单调队列+ST算法]51 nod 1288 ——汽油补给
题目梗概有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2…… -> N,车每走1个单位距离消耗1个单位的汽油,油箱的容量是T。给出每个城市到下一个城市的距离D,以及当地的油价P,求走完整个旅途最少的花费。如果无法从起点到达终点输出-1。解题思路ZZK大佬说这是N年前做过的一道题目,但是我并没有看出来。贪心比较明显,对于一个点,我们可以知道它最远能到哪个点,这样形成一个区间。如果存原创 2017-10-20 18:25:50 · 975 阅读 · 0 评论 -
51Nod 1674——区间的价值 V2
题目梗概给出一个n个数。 求所有区间的贡献的加和。 一个区间的贡献:所有数的andand值∗*所有数的oror值。解题思路首先我们要知道对一个数一直andand或者oror操作减少或增加的次数是log级别的,这个看成二进制之后就很好思考。这样我们马上就能想到枚举一个端点,然后维护log段相同的线段(and和or显然需要分开维护)。考虑加入一个新的节点。 只需要把每个线段加入一个节点,合并值相同原创 2017-09-05 21:08:43 · 527 阅读 · 0 评论 -
[DP]51 Nod 1597——有限背包计数问题
题目梗概你有一个大小为n的背包,你有n种物品,第i种物品的大小为i,且有i个,求装满这个背包的方案数有多少解题思路分块考虑这个问题,因为大于n√\sqrt n的数可以无限使用。小于n√\sqrt n的背包用前缀和维护。大于n√\sqrt n的背包变换DP的定义。f[i][j]f[i][j]表示放入了i个数,和为j,那么只有两种情况:f[i][j−i]−>f[i][j]f[i][j-i]->f[i][原创 2017-09-28 15:06:05 · 498 阅读 · 0 评论 -
[矩阵快速幂 优化DP] 51Nod 1311 转换机
题目梗概给出一个初始字符串S和目标字符串T,仅包含a,b,c三种字母。给出三种操作:1)将字符串S中的一个‘a’字符变成‘b’,并消耗cost0的花费;2)将字符串S中的一个‘b’字符变成‘c’,并消耗cost1的花费;3)将字符串S中的一个‘c’字符变成‘a’,并消耗cost2的花费;在总花费不超过M的限制下,求有多少种方案将S转化为T。(|S|<=11,M<=1e9)解题思路将S转化为T的最小花原创 2017-09-27 20:55:21 · 650 阅读 · 0 评论 -
[欧拉回路]51 Nod 1967——路径定向
题目梗概给出一张有向图,更改其中一些边的方向,最大化出度等于入度的点的个数。解题思路如果所有点出度等于入度,那么这张图构成欧拉回路。于是我们连接图中的奇点,使原图成为欧拉回路。然后遍历这个图,确定每条边的方向,奇点的边显然不对答案造成影响。Ps:这题出题人心态不对,时限卡的非常猥琐。#include<cstdio>using namespace std;const int maxn=100005原创 2017-10-17 21:29:42 · 715 阅读 · 0 评论 -
[乱搞]51 Nod 1859—Clarke and number
题目梗概给定一个数,可以对这个数做一下两种操作:x=x−kx=x-kx=⌊n√⌋2x=\lfloor \sqrt n \rfloor ^2用最小的步数使n->0。解题思路对于第二种操作,就是将x变为小于等于x的最大的平方数。显然两种操作需要交替操作。方法很简单,注意特殊情况就可以了。#include<cstdio>#define LL long longusing namespace std;原创 2017-10-17 21:39:38 · 525 阅读 · 0 评论 -
51 Nod 1563——坐标轴上的最大团
题目梗概坐标轴上有n个点,每个点有一个权值。如果两个点满足|xi−xj|>=wi+wj|xi-xj|>=wi+wj ,那么就在这两个点上建边。求图中最大团的大小。解题思路转换条件,如果两个点满足xj−wj>=xi+wi||xi−wi>=xj+wjxj-wj>=xi+wi||xi-wi>=xj+wj那么就有边。因为wi>0wi>0,所以必然有xi+wi>xi−wixi+wi>xi-wi,那么条件可以看原创 2017-10-18 10:35:01 · 621 阅读 · 0 评论 -
[数学杂题]51 Nod 1765——谷歌的恐龙
题目梗概给出一个数n,每次随机[0,n)[0,n)之间的一个数,如果随机到给出的mm个数之一就停止。求随机出来的数字的期望。解题思路真TM智障,我想了很久……能够继续下一次操作的概率为p=(n−m)/mp=(n-m)/m显然答案就是1∗1n∗S+p∗1n∗S+p2∗1n∗S……1*\frac{1}{n}*S+p*\frac{1}{n}*S+p^2*\frac{1}{n}*S……其中SS表示所有数的和原创 2017-10-18 15:10:00 · 691 阅读 · 0 评论 -
[并查集]51 Nod 1525——重组公司
题目梗概普通的并查集问题?多了一种区间合并的操作。解题思路还是很水。维护每个点前面最近的没合并的节点是谁就可以了。#include<cstdio>using namespace std;char nc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);原创 2017-10-18 19:13:57 · 658 阅读 · 0 评论 -
51 Nod 1616——最小集合
题目梗概现在有一个集合,对于任意的x,y,gcd(x,y)也在这个集合中。给出原集合中一部分的数,求原集合的最小大小。解题思路因为ai的范围感人,所以肯定能枚举原集合中元素然后判断是否存在。考虑如何判断。显然只要关于xx的倍数的gcd==xgcd==x那么xx肯定存在。所以暴力维护就可以了。#include<cstdio>#include<cmath>using namespace std;c原创 2017-10-18 20:06:30 · 633 阅读 · 0 评论 -
[树形DP]51 Nod 1500——苹果曼和树
题目梗概有一个n个节点的树,每个节点都有黑色或白色。问有多少种删边方式,使得删完后的每棵树有且仅有一个黑点。解题思路没什么好suo的,直接树形DP。#include<cstdio>#define LL long longusing namespace std;char nc(){ static char buf[100000],*l=buf,*r=buf; if (l==r)原创 2017-10-18 21:11:43 · 729 阅读 · 0 评论 -
[STL乱搞]51 Nod——1573 美丽的集合
[STL乱搞]51 Nod——1573 美丽的集合题目梗概在多重集之中,同一个元素可以出现多次。我们现在有n个多重集合,第i个集合最开始都有一个元素ai(1≤i≤n)。定义多重集合的价值为子集中不同的和的个数。现在我们有两种操作:1、合并最开始时多重集合i现在所在的多重集合与多重集合j现在所在的多重集合,成为一个新的多重集合。2、询问最开始多重集合i现在所在多重集合的价值。n<=1000n<=100原创 2017-10-06 16:32:55 · 1571 阅读 · 0 评论 -
[堆]51 Nod 1461——稳定桌
题目描述有一张桌子,有n个腿。第i根腿的长度是li。现在要拿掉一些腿,使得桌子稳定,拿掉第i根腿需要di的能量。稳定的条件是,假如拿掉若干条腿之后,桌子还有k个腿,那么长度最长的腿的数目要超过一半。比如桌子有5根腿,那么至少要有三根腿是最长的。另外,只有一根腿的桌子是稳定的,两个腿的桌子想要稳定,必需长度是一样的。你的任务是拿掉若干腿,使得桌子稳定,并且所消耗的能量要最少。解题思路考虑枚举长度,每个原创 2017-10-25 18:02:59 · 765 阅读 · 0 评论