搜索/记忆化搜索
文章平均质量分 84
alpc_qleonardo
这个作者很懒,什么都没留下…
展开
-
CodeForces - 1261F Xor-Set(动态开点线段树 + dfs)
大致题意给你AAA、BBB两个集合,两个集合里面的数字是由很多个区间构成的。现在让你求∑i∈A,j∈Bi⊕j\sum_{i \in A,j \in B}i\oplus ji∈A,j∈B∑i⊕j其中同样的异或结果只计算一次。解法显然我们要按位来考虑,对于每一位考虑异或之后可以取的数值,然后对低位就会产生对应的贡献。具体来说,如果第ddd位可以取1,那么第ddd位下面的所有位不论结果取什...原创 2019-11-28 15:23:58 · 403 阅读 · 1 评论 -
2019HDU多校赛 第九场 HDU 6682 Rikka with Mista(折半搜索 + 组合计数 + 排序)
大致题意:给你最多40个数字,你可以任意的取数字,问所有的取法下,所有取的数字的和中4的个数的和是多少。40个数字,其实就是折半搜索,但是好像有一个听起来好像挺厉害的名字meet in middle。具体来说,数字分为两半,然后分别求出两部分可以构成的所有的和。这样两部分分别最多有2^20约100W种数字,然后我们考虑这两部分求和。由于是计算和种4出现的次数,所以我们考...原创 2019-08-20 20:21:24 · 459 阅读 · 0 评论 -
CodeForces 1140F Extending Set of Points(线段树 + 并查集 + DFS)
大致题意:每个时刻往集合S里面添加或者删除一个点,然后每个时刻输出集合E(S)的大小。所谓E(S)就是对S进行拓展,如果S中存在(x1,y1)(x2,y2)(x1,y2)那么把(x2,y1)加入集合,一直到不能新加入点为止。我们仔细分析这个点加入的条件,很容易可以发现,对于一个点(x,y),相当于把第x行和第y列给合并。最后的答案就是每个连通块内的行数与列数的乘积和。所以我...原创 2019-04-04 08:39:19 · 494 阅读 · 0 评论 -
牛客练习赛31 C 无畏死灵术士莉莲娜与锁链面纱(dfs + 期望dp)
太久没有做期望/概率dp,已锈。。。大概就是说给你一个1到n的全排列,然后每次随机选择一个数字在不改变其他数字相对位置的前提下,把比他小的数字放在他前面,大的在后面。问期望几次能够使得这个序列有序。由于是求期望,所以显然是要倒着求。令dp[x]表示状态x下变得有序的期望步数。那么显然有转移方程: ...原创 2018-11-17 00:25:13 · 327 阅读 · 0 评论 -
BZOJ 3512 DZY Loves Math IV(杜教筛 + 数论 + 记忆化搜索)
这题的关键,在于这个n的数据范围,它只有1e5,所以我们可以考虑枚举n。下面开始推式子:令,设w为n所有质因子的一次方的积,v=n/w。那么根据欧拉函数的性质,有: 其中的d为gcd(i,w)。根据公式,可以有: 因为d=gcd(i,w),而且w是n所有质因子的1次方,所以说w/d一定于d/x互质,所以根据欧拉函数的积性,有:原创 2018-10-09 19:11:13 · 235 阅读 · 0 评论 -
计蒜客 Emptying the Baltic (BFS+Dijkstra)
看起来一道很神奇的题目,最后居然很想是最短路的…… 大致题意:给你一个N*N的地图,然后每个格点的面积是1,图中标明了数字表示地形的海拔。初始的时候海拔低于0的地方都有水,然后告诉你在某一个固定的位置开一个不记大小的无底洞,水可以源源不断的流入。水流符合重力因素,现在问你最后的最多能从这个洞中流出多少水。 其实这题仔细想来,还是挺坑的,看起来像是一个简单的模拟,但是实际操作起来不那么简单。首先,知道那个开口的位置,很容易想到从开口位置开始进行广搜,拓展周围的点让水流下去。具体原创 2017-12-05 21:22:51 · 429 阅读 · 0 评论 -
CSU 2023 Bless You Autocorrect! (字典树+BFS)
大致题意,给出单词表,然后让你拼写一个单词。可以支持手动输入字符,手动删除字符和摁下空格键键入单词表中与当前输入串前缀相同的第一个单词。三种操作的代价都是1,现在给出一些单词,对于每个单词输出打出单词的最小代价。 首先,字典树是肯定可以想到的,当时想法是对于每一个节点弄一个first节点,指向与当前点表示串前缀相同的第一个单词的下一个字母的节点,但是这样子处理代价的时候不好统计。其实正解已经很近了。对于每一个节点,考虑连接一条边指向经过当前表示串前缀相同的第一个单词的末端节点,并且建立一个f原创 2018-04-03 15:03:23 · 501 阅读 · 2 评论 -
HDU 5343 MZL's Circle Zhou(后缀自动机+记忆化搜索)
大致题意,给你两个字符串,然后从第一个字符串里面取出一个子串X,从第二个字符串里面取出一个子串Y,两个拼接在一起组成新的字符串,其中X、Y都可以是空串,问有多少个这样不同的串。 如果整体来思考不同的X+Y的个数,会发现找不到突破口。我们可以考虑X+Y为什么会有重复的。举个例子ababc,可以由ab+abc或则a+babc组成。重复的原因在于在第一个串中可以找到ab,也可以找到a,而如果a可以构成这个拼接串,那么ab也构成这个拼接串。所以说,为了避免重复,我们可以在第一个串中找最长的点,即原创 2018-03-25 17:08:13 · 338 阅读 · 0 评论 -
CodeChef FAVNUM FavouriteNumbers(AC自动机+数位dp+二分答案)
好久没有写数位dp了,着实快忘记怎么写了…… 大致题意是,给你一些幸运数字,然后问你在一个区间内的第k大的,含有幸运数字的数是哪一个数字。 其实做法也很简单,这种类型的题目一看就知道是数位dp,然后求第k大,肯定是二分枚举这个数字,然后每次数位dp计算小于等于这个数字的范围内有多少个数字满足条件。关键就在于如何判定这个数字是否包含了幸运数字。而AC自动机正好可以解决这个问题,我们把所有的幸运数字加入到AC自动机中,然后我们同样在AC自动机上面dp。dp[len][pos]原创 2018-02-26 15:20:18 · 294 阅读 · 0 评论 -
CSU 1889:Copying DNA 状压+记忆化搜索(KMP?)(2007 NCPC)
第七次多校赛,由于CSU校赛,然后就变成了网络赛,我们一组在本部图书馆的研讨室里面做题,然后那里就成了我们的福地。果然环境很重要吗?参加了那么多次多校赛,这次是最好的一次,A了6题,速度还很快排了第二,虽说题目水,虽说好像有大佬没有来参赛,但是真的还是值得纪念一下的O(∩_∩)O……然后这题在现场我个人感觉需要用到状态压缩,然后队友也说就是一个暴力,但是由于陈述题目的时候理解有误,所以现场并没有敲出来……然后到了场下来做这道题,一方面惊叹暴力算法的博大精深,一方面感叹题目的毒性颇深……原创 2017-04-26 17:11:53 · 762 阅读 · 0 评论 -
HDU 3709 Balanced Number(数位dp)
人生第一道数位dp,还几乎是自己想出来的,纪念一下…… 数字要平衡,即力矩平衡。一般来说,数位dp求一个区间内满足条件的方案数,都是要用区间的性质,即对于询问区间[l,r]我们的最后过往往是拿0~r的个数减去0~l-1的个数。然后dp的时候,就按照数位来做。这道题因为有力矩的存在,所以也与支点的选取有关,所以我们要加一维表示支点。dp[i][j][k]表示,当前长度为i支点为j力矩和为k的方案数。那么很容易得出状态转移方程:dp[i][j][k]=sigma(dp[i-1][j][k-x*(原创 2017-07-24 18:29:12 · 330 阅读 · 0 评论 -
CSU 1993 大司马的三角形中单(数位dp)
当时不够时间写了,但是后来回来了还是写了写,想清楚后,二十分钟左右就过了。 这里所谓三角形数,就是指数字从第一位开始先严格递增,在严格递减,然后最后有多个0也算是允许的。然后问你在一个区间内,有多少个这样的三角形数。这样的题目很显然就是数位dp。可以考虑,设dp[len][x][tp]表示在数字长度为len,第len位数字为x,tp为bool类型,表示是否已经出现转折点。这里我们先不考虑后面可以有多个0的情况。然后转移的话,要仔细考虑清楚,分几种情况。首先看是否出现过转折点,如果当前状态已经原创 2017-09-02 23:11:51 · 1277 阅读 · 0 评论 -
CodeForces 55D Beautiful numbers(数位dp+数论)
很明显的一道数位dp,但是转移却并不是那么好想。 大致题意是,让你求区间内所有的能够每一位数字整除的数字有多少个。 最初始的想法是,设置dp[len][x]表示长度为x时且当前为x的倍数的时候的数量,但是在考虑转移的时候却发现,不能很好的处理这个倍数整除关系,每次新加入一个数字就会产生一个新的因子。于是抛弃这个想法。这里,我们考虑利用一些同余的性质,若a≡b(mod m) 且d|m 则a≡b(mod d)。我们可以知道,lcm(1~9)=2520,若a≡b(mod 2520)原创 2017-09-26 00:37:44 · 245 阅读 · 0 评论 -
CodeForces 855E Salazar Slytherin's Locket(数位dp+搜索剪枝)
又是一道数位dp。 大致题意是给你一个进制b,然后问你区间[l,r]之间的数字,转换为b进制之后,有多少个数字满足,0~b-1中的每一个数字出现在每一位的次数是偶数。 其实这里加了一个进制,无非就是多了一维表示不同进制,然后分解数字时按照进制分解,枚举每一位数字时枚举到b-1而已。真正关键的还是状态的转移。这里考虑由于要每一个数字出现的次数为偶数,所以我们就可以用奇偶对应0、1来表示。由于最多是10进制,所以我们可以用一个10位的二进制数字来表示0~b-1这些数字出现的次数是原创 2017-09-27 08:13:58 · 548 阅读 · 0 评论 -
hihoCode 1249 A Math Problem ACM/ICPC 2015 Beijing (数位dp+规律)
题目本身在UVa,但是据说数据有问题,请在hihoCoder上面提交…… 大致题意:告诉你一个整数函数满足的式子,然后f(1)~f(n)每个函数值对K取模,每一个统计取模之后每一个数字出现的次数,数尺所有数字出现次数的异或和。 本来以为是一道找规律题或者说是数论题,但是没想到居然是一道dp?!根据题目给出的表达式,我们容易求出f(n)递推公式:f(2*n+1)=3*f(n)+1,f(2*n)=3*f(n),f(1)=1。然后我们多写出几项f(1)=1,f(2)=3,f(3)=原创 2017-12-10 18:10:36 · 371 阅读 · 0 评论 -
CodeForces 906C Party(状态压缩+dfs)
日常打cf…… 大致题意:给你一堆一对对的关系,然后每一个关系对代表两个人认识。然后你每次可以选择一个人i,让i认识的所有人都相互认识,即i把介绍自己所有的朋友给其他人。然后现在问你最少需要选择多少个这样的i,使得所有的人都相互认识。 看到只有22的数据范围,很容易想到状态压缩,但是如何利用这个状态压缩却没那么好考虑。如果考虑状态压缩dp,显然无法表示连通的状态。于是考虑用搜索,22个点要么最后被选要么没有,做多2^22=400W+,在承受范围内。然后就是看如何处理这个关系了原创 2017-12-24 21:05:44 · 1165 阅读 · 0 评论 -
UVALive 7263 Today Is a Rainy Day(BFS预处理)
非常聪明的搜索。 大致题意:给你很多1~6的数字组合表示的状态,一个起始状态一个终止状态。每一步你可以选择两种操作中的一种,一是选择其中一个位置的数字变成另一个,二是选择一类数字,把所有该数字变成另外一个数字。 首先,很显然的,最优答案一定是先做第二个操作,然后再做第一个操作,然后操作数肯定小于数字的长度。于是,根据这个,我们便是可以枚举所有的第二个操作的变换。注意到每个数字只会变成其他五个数字,而且不会往回变,所以总的变换个数就是6!个,但是实际为了方便不考虑那么多,认为有原创 2017-12-12 00:15:06 · 333 阅读 · 0 评论 -
CSU 1843:Jumping monkey 状压BFS (2010 Southwestern European Regional Contest)
1843: Jumping monkey Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 71 Solved: 13 DescriptionYou are a hunter chasing a monkey in the原创 2017-03-28 16:48:01 · 811 阅读 · 0 评论 -
2017多校训练赛第一场 HDU 6035 Colorful Tree (dfs+正序统计)
这题,好像是没做出的所有题目中,最容易做出来的题目,但是当时真的静不下心啊…… 统计所有路径上的颜色数量,直接枚举所有的路径条数显然不行,比较惯用的计算方法是统计每一个点对最后结果的贡献。这里题解是用了补集的思想,反过来求,我给出一种另外的思路,不反着做,直接正着统计和。 首先,我们规定,对于同一条路径上的两个相同的颜色,我们只统计dfs序靠前的那个。然后,对于一个点i,我们可以分成两种情况讨论。第一种情况,我们只计算i的子树范围内的方案数,这个还是比较容易计算的,其中一部分原创 2017-07-26 19:44:36 · 570 阅读 · 0 评论