![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
HDOJ
Winterfell30
这个作者很懒,什么都没留下…
展开
-
HDOJ 4349 Xiao Ming's Hope (Lucas定理变形)
题意求C(n,0),C(n,1),C(n,2)...C(n,n)C_{(n, 0)},C_{(n, 1)},C_{(n, 2)}...C_{(n, n)}里有多少个奇数。思路考虑Lucas定理,C_{(n, m)} = C_{(n%p, m%p)} * Lucas(n / p, m / p)C_{(n, m)} = C_{(n%p, m%p)} * Lucas(n / p, m / p) 这个定理原创 2016-05-10 18:16:22 · 568 阅读 · 0 评论 -
HDOJ 2196 Computer (经典题)
题意有一个树,每条边都有权值,求每一个点出发的链的最大权值和。思路很经典的树形dp题目,和树的直径的性质相关。 从任意点出发能到达的最远的点一定是直径的一个端点,然后再从这个端点出发能到达的最远的点就是另一个断点,中间的边就是这个树的直径。 我们用两个dfs,第一次维护一个点到他的子树的最长路,第二次用来更新结果。比如u点的最长路,要么从他到他的子树叶节点,要么是从u到达根节点加上根节点到距离根原创 2016-05-26 20:24:14 · 440 阅读 · 0 评论 -
HDOJ 5807 Keep In Touch
A - Maximum Increase求最长连续子串长度int a[maxn];int main(){ //freopen("H:\\in.txt","r",stdin); //freopen("H:\\out.txt","w",stdout); int n; scanf("%d", &n); int ans = 0, mmax = 0, now = 1;原创 2016-08-01 17:17:00 · 463 阅读 · 0 评论 -
HDOJ 5724 Chess (SG)
题意有n排列数为20的格子,有些行的有些格子放有棋子,每次可以把一个棋子向右移动一个格子,也可以从别的棋子上面跳过去,不能走的人即为输,判断这个人输赢。思路加深了一下对求SG表的记忆,其实就是类似DP的考虑当前状态可以通过一步变成什么子问题的状态,然后就求子问题中不存在的mex就行了。 这个题在算某个行的状态的时候把每一行状压一下然后枚举下一步的子问题就可以了。代码#include <stdio.原创 2016-10-23 21:21:04 · 355 阅读 · 0 评论 -
HDOJ 5738 Eureka
题意给出一些点,求有多少个集合满足在所有其他点都在其中两个点中间。思路首先题目给的那个式子化简之后就变成了求点共线的组合数的问题。 首先想到通过斜率统计然后否定了因为精度不行然后考虑把斜率表示成向量的形式,但是向量会有平行的情况也不好处理。然后用了这种固定一个点来求贡献的做法,不需要考虑平行也不需要考虑精度,唯一需要考虑的就是重点的问题了。单独考虑重点的时候集合就是2num−1−12^{num-1原创 2016-10-23 21:38:27 · 482 阅读 · 0 评论 -
HDOJ 5745 La Vie en rose (bitset优化DP)
题意字符串s和p,p可以交换相邻两个字符的位置但是只能交换一次。求每个s[i]到s[i+len(p)-1]是否能由p变化得到。思路dp[i][j][0/1/2]分别表示在s的i位置和p的j位置时p[j]与p[j-1]交换、不交换、与p[j+1]交换时是否能变换得到。 因为dp是一个bool数组所以我们可以用bitset表示第一维也就是母串的匹配情况,第二维滚动一下。对于s[i]和p[j]的匹配情况原创 2016-10-23 21:53:29 · 457 阅读 · 0 评论 -
HDOJ 5754 Life Winner Bo
题意在1,1处的国际象棋,两个人依次移动,走到n,m。 求King,Queen,knight,castle走法的时候谁会赢或者平局。思路国王就判断一下要走步数的奇偶性就可以了,都为偶数的时候G会胜利。 车走的时候相当于两堆石子每次取任意个,也就是说直接的nim,两个步数异或起来就可以了。或者考虑对称性也能得到。 女王走的时候因为多加了斜着走,就相当于两堆石子中多加入了同时取相同个数石子的操作就原创 2016-10-24 12:52:42 · 462 阅读 · 0 评论 -
HDOJ 5769 Substring
题意求一个字符串有多少个不同的子串,要求这些子串都包含至少一次x字符。思路如果不考虑包含x字符的话,求不同子串个数是一个后缀数组经典问题(spoj 694)。考虑那个问题的做法:∑leni=1len−sa[i]−lcp[i]\sum_{i=1}^{len}{ len - sa[i] - lcp[i]},len-sa[i]就是sa[i]开头的串的个数,再减去sa[i-1]时减过的lcp[i],累加起来原创 2016-10-25 21:52:06 · 396 阅读 · 0 评论 -
HDOJ 5763 Another Meaning
题意给两个字符串a和b,b有两义性,求a一共有多少种可能的意思。思路首先KMP预处理出所有b是a子串的末尾位置,然后基础dp就可以了。 如果i位置是子串末尾则dp[i] = dp[i-1] + dp[i-lenb] + 1否则直接转移。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>原创 2016-10-26 00:30:49 · 369 阅读 · 0 评论 -
HDU 5781 ATM Mechine
题意取款机里面有0-K不确定的钱数,如果查询的钱数超过余额就会警告一次,否则不警告,求警告W次内猜到确定钱数的期望是多少。思路dp[i][j]表示还剩0~i的钱数时还可以被警告j次的期望。 那么得到 dp[i][j]=dp[k−1][j−1]∗ki+1+dp[i−k][j]∗i+1−ki+1+1dp[i][j] = dp[k-1][j-1] * \frac{k}{i+1}+dp[i-k][j]原创 2016-11-01 15:17:03 · 392 阅读 · 0 评论 -
HDOJ 3537 Daizhenyang's Coin
题意给出一些正面朝上的硬币的位置,每次可以将一个或者两个或者三个硬币翻面。最右边一个硬币必须是正面的,最后不能操作的人输。思路SG打出表,然后能发现SG(n)是有规律的,当2n的二进制位的1的个数是奇数时SG(n)=2*n,否则是2*n+1。 这个规律的证明网上有很多不再赘述,附上SG打表代码。代码#include <stdio.h>#include <string.h>#include <i原创 2016-08-04 01:03:12 · 616 阅读 · 0 评论 -
HDOJ 3938 Portal (离线并查集)
题意给出一个带边权的图,令两个点之间的路径的费用为中途经过的边的最大值,对每个查询求有多少对点路径费用小于等于给定的L。思路用类似kruskal的思想,每个点都设置一个sum数组表示它所相连的所有满足小于当前L的边相连的点有多少个(其实数组名用size更合适)。 然后对于每次查询L,因为边我们也是升序排序的,所以对于所有小于L的边都有sum[find(edge[i].u)]*sum[find(ed原创 2016-07-10 16:23:08 · 419 阅读 · 0 评论 -
HDOJ 1811 Rank of Tetris (并查集+topo)
题意给出一些人之间的rating高低或等于关系,判断给出的关系是否冲突,能不能通过这些排出所有人。思路如果没有等于的话这个题是个比较经典的拓扑排序,加上等于之后我们每次相等的两边的关系需要合并,所以用并查集专门维护一下相等时的关系集合,其他的拓扑排序来做即可。代码#include <stdio.h>#include <string.h>#include <iostream>#include <原创 2016-07-10 16:12:43 · 445 阅读 · 0 评论 -
HDOJ 1796 How many integers can you find (容斥)
题意求n以内有多少个数能整除至少一个给出的数组中的数。思路经典的裸容斥,把所有的因子相乘的情况枚举一下奇数加,偶数减就可以了。 这个题有个很坑的地方就是输入里面有0,不过幸好judge出来的RE,还是可以判断出来的。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <原创 2016-05-03 20:27:54 · 364 阅读 · 0 评论 -
HDOJ 4135 Co-prime (容斥)
题意求a和b之间有多少个数和n互斥。思路显然问题能转化成a-1之内和b之内与n互斥的个数,然后我们可以求它的反问题也就是m之内与n不互质的数字个数,某个数与n不互质也就是这个数能被n的某一个或多个质因子整除,然后就是经典容斥了。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#incl原创 2016-05-04 17:41:30 · 378 阅读 · 0 评论 -
HDOJ 1573 X问题 (余数不互质的中国剩余定理)
题意求n以内有多少个数满足x%a[i]=b[i]。思路能发现我们可以用不互质的中国剩余定理求出来最小的x,然后(n-x)/lcm+1求个数 然后我就WA了好几发。。。注意求出的x为0且不是无解的时候最后的个数是(n-x)/lcm。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#in原创 2016-05-16 23:15:12 · 603 阅读 · 0 评论 -
HDOJ 3037 Saving Beans (Lucas定理)
题意给出n个树和m个种子,求把这m个种子放到n棵树中有多少中方法,可以选择不放。思路因为有可以不放的选择,所以我们可以看成是多加了n棵空树,所以答案就是C(mn+m)C\binom{m}{n+m} 因为n和m都很大,p比较小,所以直接用lucas就可以了。代码#include <stdio.h>#include <string.h>#include <iostream>#include <a原创 2016-05-09 11:55:37 · 768 阅读 · 0 评论 -
HDOJ 1430 魔板 (bfs+映射)
题意对于一个上面4个数下面4个数的魔板,可以如下操作: A: 上下两行互换 B: 每行循环右移一格 C: 中间4个方块顺时针旋转一格 给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的。思路在做之前我知道它是一个康拓展开的题,但是在我读题之后感觉直接bfs就可以了啊,一共8!个状态随便过啊= =,然后就超时了。。。 然后发现是我捉急了,这原创 2016-05-18 17:58:27 · 531 阅读 · 0 评论 -
HDOJ 3415 Max Sum of Max-K-sub-sequence(线段树优化DP)
题意给出一个环,求连续的k个数字中连续和最大是是多少,子串的开始下标和结束坐标是多少。思路第一次做这题的时候是在学单调队列的时候,单调队列的做法戳这里 这里我是直接dp搞,dp[i]=sum[i]−min(sum[j])i−k<=j<idp[i] = sum[i] - min(sum[j]) i - k <= j < i 显然直接做复杂度O(nk)是超时的,就用线段树维护一下min(sum[j原创 2016-05-20 21:14:49 · 410 阅读 · 0 评论 -
HDOJ 5255 魔法因子 (数学)
题意给出一个x,求有多少个长度小于等于10位的数,乘以x之后最高位和最低位互换其他不变。思路因为只有两位是动的其他不动,所以我们令高位为high,低位为low,中间位是mid,那么我们能得到 (high∗10len−1+mid+low)∗x=low∗10len−1+mid+high(high * 10 ^{len-1} + mid + low) * x = low * 10 ^ {len-1} +原创 2016-05-21 12:35:14 · 467 阅读 · 0 评论 -
HDOJ 2457 DNA repair (AC自动机+DP)
题意给出一些子串和一个DNA串,求最少需要变换多少个字符可以让这个DNA不包含任意一个子串。思路dp[i][j]表示在字符串i处在trie图的节点j处时的最小改变数。 然后对字符串和每个节点都枚举递推一遍就行了。代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <ve原创 2016-06-03 21:28:18 · 504 阅读 · 0 评论 -
HDU 5787 K-wolf Number
题意求区间[l,r]中有多少个数不存在连续k位含有相同的数位。思路比较裸的数位DP,但是因为刚开始没有想好思路就开始写后来调试挺长的时间。 因为K比较小,所以我们直接加4维状态分别表示前面取的四个数,每次加下一个的时候根据K判断一下就好了。有些不好处理的地方是010这种有前导零的,那么前导零我们统一用11这个数位取不到的数来表示就可以了。代码#include <stdio.h>#include原创 2016-11-01 15:27:23 · 543 阅读 · 0 评论