
51nod题解
文章平均质量分 55
DYT_B
略过
展开
-
51Nod - 1398 等公交
题解这题是比较基础的概率DP题。定义f[i]表示第i个时刻的所有的情况的概率和。f[i]由∑f[i−time[j]]\sum f[i-time[j]]来转移就好了。最后枚举一下在他上车之前的最后一辆车是那一辆*他等的时间就好了。 代码如下:#include<cstdio>#include<string>using namespace std;const int maxn=105,maxt=1原创 2017-11-04 15:57:49 · 320 阅读 · 0 评论 -
Prufer编码:51nod 1806 wangyurzee的树
题目描述:戳这里题解:原创 2018-10-29 18:42:21 · 289 阅读 · 0 评论 -
51nod 1681 公共祖先
题目描述:戳这里题解:这个题目有一个非常好的技巧。我们要求的其实是某一个点在两颗树中的子树中同时含有的点的数量。我们发现这个东西很难求,因为这个东西在两个子树中都是散乱无序的。那么我们如果把一颗子树中的量变得有一定的关系可循,那么接下来只需要关心另一颗树就好了。那么我们不妨把第一颗树重新标一个号,编号就为原树的dfs序。那么第一颗子树中的点的编号都会变成连续的。接下来只要到第二颗子树中查询这个...原创 2018-10-28 19:02:58 · 265 阅读 · 0 评论 -
51nod题解小集
1406:f[x]表示与x相与之后值为x的数的个数。转移就是删掉某一个二进制位上的1。但是如果先枚举当前的值,再枚举删掉那一位会产生重复(一个数删掉一个位上的1或者删掉另外一个位上的1最后都会转移到同时删掉这两个1的情况)。那么我们可以改一下循环的顺序,先枚举删掉的位,再枚举当前的数,就不会有重复啦233331407:这题是上一题的升级版本。考虑容斥。要求出相与后1的位数为x的对数只要求出相与后...原创 2018-10-06 14:20:28 · 541 阅读 · 0 评论 -
51nod 1421 最大MOD值
题解: 这题是一道思维题。 我们可以把ai mod aj转换成 aj*k+ai。 那么我们可以枚举k,然后二分一下小于aj*k的最大的数是多少,用它mod aj的值来修正答案。 由于枚举k总共的复杂度是log的,可以类比埃式筛法。 那么总的复杂度是O(n)log^2(n),可以水过。代码如下:#include&lt;cstdio&gt;#include&lt;string&...原创 2018-07-14 15:49:18 · 246 阅读 · 0 评论 -
51nod 1022 石子归并 V2
题解:这是一道石子合并的加强版DP。对于环,我们可以延长到2*n就好了。但是传统的石子合并DP是O(n^3)的,对于养的数据强度显然会超时。 这里就要引入一个四边形不等式的概念。我们定义s[i][j] 表示将i到j合并中间的最小分割点是哪个(即为k)。 我们先写一下DP转移方程:f[i][j]=f[i][k]+f[k+1][j]+sum[i][j]。 我们发现这个DP中的sum[...原创 2018-06-23 07:57:22 · 195 阅读 · 0 评论 -
51nod 1253 Kundu and Tree
题解:这是一道比较简单的题目。 我们发现其实黑边是没有用的,三个点只要中间的到两边都有红边相连就好了。 那么我们可以容斥一下。把所有的黑边都并查集到一起,形成好多块。 那么答案=任选三个数的方案数-一个块中选三个的方案数-一个块中选一个,另一个中选两个的方案数。 注意并查集最后的fa数组并不是这个点最后的fa,要再做一次并查集。 代码如下:#include<cstdio...原创 2018-06-22 21:23:37 · 232 阅读 · 0 评论 -
51nod1486 大大走格子
题解:这是一道DP题。 如果没有那个障碍的条件,就是简单的组合数C(n+m-2,n-1)+逆元了。 但是有这个条件,我们不能直接减掉经过那些障碍的方案数,因为会有重复。 仔细思考一下,会发现答案其实就是f[0]-f[1]+f[2]-f[3]+…+f[n]这样的(f[i]表示经过i个障碍物的方案数)但是这样我们就要写一个n^3的DP,复杂度会爆炸。 我们可以换一种想法,f[i]表...原创 2018-06-22 15:25:17 · 276 阅读 · 0 评论 -
BZOJ1257: [CQOI2007]余数之和sum==51nod1225 余数之和 (略有不同)
BZOJ传送门题解:这题做过好几次,只要对于除值相同的部分进行分块,一块一块处理就好了啊。。。 代码如下(51nod版本):#include<cstdio>#include<string>using namespace std;const int tt=1000000007,inv2=(tt+1)/2;long long n,m,ans;lo...原创 2018-02-17 22:08:51 · 255 阅读 · 0 评论 -
51nod 1040 最大公约数之和
题解这题是欧拉函数的经典题。欧拉函数φ(p)表示的是与p互质的数的个数(包括1)。这和本题好像没有什么关系,这是就需要我们来转化了。gcd(n, i) = x(x为这个因子)的个数,可以表示成gcd(n / x, i / x) = 1的个数,这就是典型的求解n/x的因子个数的题目了,只要我们单个求解φ(n/x)就好了。 欧拉函数相关知识代码如下:#include<cstdio>#include<原创 2018-02-09 16:33:49 · 309 阅读 · 0 评论 -
51nod 1020逆序排列
题解:这题肯定是DP题。定义f[i][j]表示前i个数,产生j组逆序对的排列数量。那么显然可以想到n^3的做法,就是枚举当前第i个数放在哪里。但是这样是会超时的。但是我们可以稍加推导,最后得出f[i][j]=f[i][j-1]+f[i-1][j]-f[i-1][j-i],这样就不会超时了。。。 代码如下:#include<cstdio>#include<s...原创 2018-02-09 16:24:04 · 357 阅读 · 0 评论 -
51Nod 1055 最长等差数列
题目描述:懒得截图**题解:要注意一个条件,“找出由这些数组成的最长的等差数列”,说明这些数不一定要按顺序组成等差数列。那么我们就可以肆无忌惮的排序了。排好序以后就要考虑dp了。f[i][j]表示等差数列的第一项是a[i],第二项是a[j]的最长长度(不看别人题解真的想不到)。那么f[i][j]的转移是f[k][i] (当a[k],a[i],a[j]为等差数列时),dp的转移方式比较神,具体看代码:原创 2017-11-04 16:29:51 · 298 阅读 · 0 评论 -
51Nod - 1833 环
题目描述题解这题看似非常不可做,但是其实我们可以转换一下,形成不相交的简单环其实就是二分图的一个完美匹配。知道了这一点我们就可以直接写一个状压dp(因为n比较小)。定义f[i][j]表示前i个数,匹配的状态为j的方案数,则转移就比较简单了。然后就莫名其妙卡过去了! 代码如下:#include<cstdio>#include<string>using namespace std;const i原创 2017-11-04 15:43:57 · 980 阅读 · 1 评论