Dp似神仙
文章平均质量分 70
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
leedcode 404周赛 100318. 合并两棵树后的最小直径
这里涉及到一个树直径的概念,树中任意两点的最大距离被称为树的直径。可以设想不会有点的深度比这个值还大,否则这个点和直径两端的点间的距离会超过。(v是u的儿子,并且这是个递归的过程,叶节点是终止条件)如果p1不在树1的直径上,那么以p1为根,树的深度至少是。如果p1在树1的直径上,且不为中点,树的最大深度显然超过。如果p1在树1的直径上,令p1为直径中点可以取到最优值。为树2直径的中点,这样可以最小化这个距离。(p1到直径两端的较远点深度大于这个值)表示子树中的次大深度,显然如果直径过点。原创 2024-06-30 12:17:09 · 693 阅读 · 0 评论 -
Educational Codeforces Round 116 (Rated for Div. 2) E. Arena(组合数,DP )
Link考虑第一批人在第kkk轮死掉,那么这些死掉的人血量在[(k−1)∗(n−1)+1,k∗(n−1)][(k-1)*(n-1)+1,k*(n-1)][(k−1)∗(n−1)+1,k∗(n−1)]范围内定义f[i][j]f[i][j]f[i][j]表示已经死了iii个人,且剩下的n−in-in−i个人可以是[j+1,x][j+1,x][j+1,x]的任何血量转移的时候枚举下一批过了kkk轮死掉qqq人,那么容易推得下一批人的血量范围是[j+(k−1)∗(n−i−1)+1,j+k∗(n−i−1)][原创 2021-10-31 19:14:35 · 337 阅读 · 0 评论 -
ABC224 F - Problem where +s Separate Digits(维护dp)
f[i]=∑j=1i( f[j−1]+sum(j,i) )f[i]=\sum\limits_{j=1}^i (\ f[j-1]+sum(j,i)\ )f[i]=j=1∑i( f[j−1]+sum(j,i) )f[i]=∑j=1i−1f[j[+∑j=1isum(j,i)f[i]=\sum\limits_{j=1}^{i-1}f[j[+\sum\limits_{j=1}^i sum(j,i)f[i]=j=1∑i−1f[j[+j=1∑isum(j,i)...原创 2021-10-26 11:47:11 · 472 阅读 · 0 评论 -
ABC223 G - Vertex Deletion(换根dp)
Link考虑定义f[i][0/1]f[i][0/1]f[i][0/1]表示子树iii内能匹配的最大数目(状态0/10/10/1表示节点iii是否被使用)fff数组做一遍树形dpdpdp就可以得到.然后考虑换根,也就是当除掉点uuu后整棵树的最大匹配数目想要得到除去uuu后的最大匹配数分为两部分,一个是uuu子树内,这部分显然就是∑(u,v)max{ f[v][0],f[v][1] }\sum\limits_{(u,v)}\max\{\ f[v][0],f[v][1]\ \}(u原创 2021-10-20 14:29:42 · 312 阅读 · 0 评论 -
牛客挑战赛53 C.奇奇怪怪的魔法阵(状压)
Link我们要求fT=∑S∈T[S为独立集]f_T=\sum\limits_{S\in T}[S为独立集]fT=S∈T∑[S为独立集]考虑集合TTT的最低位二进制位代表的集合是yyy(这个点设为uuu),其他二进制位代表的是xxx那么T=x+yT=x+yT=x+y显然,若SSS集合中不包含集合yyy(点uuu),方案数为fxf_xfxSSS集合中不包含集合xxx,方案数为fy=1f_y=1fy=1若SSS中包含集合yyy且包含集合xxx中的部分点需要满足包含的集合xxx中那些点不与点u原创 2021-10-18 10:08:30 · 171 阅读 · 0 评论 -
CF1140E Palindrome-less Arrays(巧妙的递推)
LINK题意一个数组有些位置是???,你可以使用[1,k][1,k][1,k]填充满足最后对于i∈[1,n−2]i\in[1,n-2]i∈[1,n−2]有ai!=ai+2a_i!=a_{i+2}ai!=ai+2,求方案数我们分成奇数索引构成的数组和偶数索引构成的数组分别考虑现在设奇数索引构成的数组为aaa,条件限制相当于相邻元素值不能相同.考虑到???可能连成一块,这就变得非常麻烦,其实可以把连续的???缩成一个块设f[i][0]f[i][0]f[i][0]表示???块长度为iii,且问原创 2021-10-13 17:13:22 · 227 阅读 · 0 评论 -
229 D. Towers(单调性/单调队列dp)
LINK定义f[i][j]f[i][j]f[i][j]表示前iii个数分割,最后一段是[j+1,i][j+1,i][j+1,i]合为一段有转移,在满足后一段大于前一段的前提时有f[i][j]=min{ f[j][k]+(i−j−1) }f[i][j]=\min\{\ f[j][k]+(i-j-1)\ \}f[i][j]=min{ f[j][k]+(i−j−1) }注意到转移中的i−1i-1i−1可以被分离出来f[i][j]=min{ f[j][原创 2021-09-30 10:36:31 · 227 阅读 · 0 评论 -
The 9-th BIT Campus Programming F. 狂乱(背包)
LINK首先枚举每一个随从ppp作为被控制的随从,这部分复杂度为O(100)O(100)O(100)然后用ppp打死其他随从需要的血量是固定的,获得的价值就是其他随从的攻击力看起来可以做个背包,但是当ppp快死亡时的最后一击,即使之还剩111滴血也可以发起最后一击显然需要枚举最后一次攻击打死哪个随从,这部分复杂度为O(100)O(100)O(100)再套一个背包复杂度就太高了,但是我们可以提前预处理处理f1[i][j]f1[i][j]f1[i][j]表示在[1,i][1,i][1,i]个随从花费原创 2021-09-23 17:08:27 · 284 阅读 · 0 评论 -
Codeforces Round #511 (Div. 2) E. Region Separation(思维,性质,dp)
LINK题意每一轮可以砍掉若干条边,满足每个连通块权值相等,求砍树方案数.两种方案不同,当且仅当至少存在一轮,剩余的连通块不完全相同.考虑如果把树分成kkk份,那么每个连通块的权值为Sk\frac{S}{k}kS我们dfsdfsdfs这棵树,若存在一颗子树的权值等于Sk\frac{S}{k}kS,显然需要砍掉这个儿子和父亲的边这样重复做下去,发现需要砍掉所有满足Sk∣su\frac{S}{k}|s_ukS∣su的uuu与父亲的边我们定义f[k]f[k]f[k]表示f[k]=∑i=1原创 2021-09-18 10:50:56 · 243 阅读 · 0 评论 -
AtCoder Beginner Contest 207 F - Tree Patrolling(树上背包)
LINK定义f[i][j][sta=0/1/2]f[i][j][sta=0/1/2]f[i][j][sta=0/1/2]表示iii的子树中有jjj个节点受到保护当sta=0sta=0sta=0时,节点iii和他的直接儿子都没有放置保安当sta=1sta=1sta=1时,不管儿子怎样,反正点iii放置了保安当sta=2sta=2sta=2时,自己没有放置保安,但至少存在一个直接儿子放置了保安转移方程就像树上背包那样类似的转移即可特别的当之前自己的状态为000且儿子的状态为111时,那么自己的状态原创 2021-09-16 16:40:26 · 356 阅读 · 0 评论 -
ABC 209 F - Deforestation(插入dp)
LINK题意nnn棵树,砍掉第iii棵树的代价是Hi+Hi−1+Hi+1H_i+H_{i-1}+H_{i+1}Hi+Hi−1+Hi+1,之后HiH_iHi变为000砍掉这nnn课树有n!n!n!种砍树顺序,问有多少种是最小代价的砍树方案.怎样砍树是最优的?现在只考虑第iii棵树和第i+1i+1i+1棵树带来的代价若第iii棵树先被砍,那么此时代价为Hi+2∗Hi+1H_i+2*H_{i+1}Hi+2∗Hi+1若第i+1i+1i+1棵树先被砍,那么此时代价为2∗Hi+Hi+12*H原创 2021-09-16 11:09:56 · 391 阅读 · 0 评论 -
AtCoder Beginner Contest 213G - Connectivity 2(状压dp神仙题)
LINK题意给定简单无向图 G=(V,E)G=(V,E)G=(V,E),点的编号从111到∣V∣=n|V|=n∣V∣=n.对于k=2..nk=2..nk=2..n,求 H=(V,E′⊆E)H=(V,E′⊆E)H=(V,E′⊆E) 的个数,使得 111 与 kkk 连通。n≤17,m<=n∗(n−1)2n≤17,m<=\frac{n*(n-1)}{2}n≤17,m<=2n∗(n−1)。考虑最后图的状态,点111和点kkk处于同一个连通块,这个连通块到其他点没有边定义全集U=(1原创 2021-09-15 17:08:37 · 506 阅读 · 0 评论 -
Educational Codeforces Round 49 E. Inverse Coloring(思维,差分,dp)
link题意给出一个n∗nn*nn∗n的矩阵,要求在每个位置涂上黑/白色,要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反。任意相邻的两列,其颜色也要么相同要么完全相反。且这个矩形中,不存在任意一个大小大于等于k的同色矩形。求方案数第一个比较有技巧的点是一个矩形确定了第一行第一列的颜色后,整个矩形的颜色就被确定了现在考虑怎样来判断是否存在大于等于kkk的同色矩形,我们只需要找到最大的那个是否小于kkk即可我们先计算第一行最大连续同色段长为xxx,第一列为yyy那么x∗y<原创 2021-09-15 15:45:33 · 254 阅读 · 0 评论 -
AtCoder Beginner Contest 214 F - Substrings(容斥dp)
LINK定义f[i]f[i]f[i]表示[1,i][1,i][1,i]的以iii结尾的不同子串个数(这些子串不在j<ij<ij<i时的f[j]f[j]f[j]中计算)由于∑j=0i−1f[j]\sum\limits_{j=0}^{i-1}f[j]j=0∑i−1f[j]是本质不同的子序列,在后面都加上一个aia_iai,彼此仍然是本质不同子序列如果不考虑重复问题,转移方程为f[i]=∑j=0i−1f[j]f[i]=\sum\limits_{j=0}^{i-1}f[j]f[i]=j=原创 2021-09-15 11:51:05 · 275 阅读 · 0 评论 -
AtCoder Beginner Contest 217 F - Make Pair(区间dp)
LINK区间dpdpdp,定义f[i][j]f[i][j]f[i][j]表示[i,j][i,j][i,j]所有人匹配完成的方案数,最后答案是f[1][2∗n]f[1][2*n]f[1][2∗n]每次枚举和iii配对的节点qqq,那么问题转化为把[i+1,q−1][i+1,q-1][i+1,q−1]配对和把[q+1,j][q+1,j][q+1,j]配对这两部分相互独立,所以用乘法f[i][j]=∑(i,q) is goodf[i+1][q−1]∗f[q+1][j]∗((j−q)/2原创 2021-09-12 16:54:14 · 256 阅读 · 0 评论 -
2021 CCPC网络赛 HDU .7111 Remove(单调队列dp)
LINK给定一个素数集合PPP,若一堆石子有nnn个你每次可以选择素数集合中的一个ppp令n=n−n%pn=n-n\%pn=n−n%p最后你要让nnn变为000,或者无解,我们定义f(i)f(i)f(i)表示把一堆石子iii变为零的最小操作次数求(∑n=1Nf(n)∗23333N−n)%264(\sum\limits_{n=1}^N f(n)*23333^{N-n})\% 2^{64}(n=1∑Nf(n)∗23333N−n)%264特别的,如果nnn无解令f(n)=0f(n)=0f(n)=0原创 2021-08-28 23:04:53 · 588 阅读 · 5 评论 -
2021牛客暑期多校训练营5 G.Greater Integer, Better LCM(搜索,子集合并)
LINKlcm(a+x,b+y)lcm(a+x,b+y)lcm(a+x,b+y)的意义就是对于每个质因子幂取a+xa+xa+x和b+yb+yb+y中更大的那个而且a+xa+xa+x和b+yb+yb+y在每个质因子上,至少一个是最高次幂,这才能满足lcm(a+x,b+y)=clcm(a+x,b+y)=clcm(a+x,b+y)=c考虑枚举a+xa+xa+x和b+yb+yb+y在每个质因子取到的幂次,复杂度是不超过O(2∑qi)O(2^{\sum\limits q_i})O(2∑qi)这些状态我们可原创 2021-08-08 11:39:11 · 298 阅读 · 0 评论 -
2021牛客暑期多校训练营2 G.League of Legends(模型转化,单调队列dp)
LINK题意给定nnn个区间分成kkk组,要求每组至少一个区间,每个区间恰好属于一个组每组的贡献是区间的交的点数,每组至少需要有一个公共交点求最大收益,无解输出0.考虑一个区间包含了小区间,那么这个区间只有两种决策是最优的Ⅰ.单独成一个组,贡献就是自己的长度Ⅱ.加入到自己包含的那个小区间的组去,此时答案不变对于情况Ⅱ,答案不变不需要考虑.对于情况Ⅰ,单独成组可以先放一放考虑剔除这些区间,剩下的区间有一个非常好的性质,就是左端点递增的同时右端点也递增如果这考虑这些区间,会发现选择连续相邻原创 2021-08-05 23:59:26 · 302 阅读 · 0 评论 -
2021牛客暑期多校训练营1 I.Increasing Subsequence(期望,维护后缀和优化dp)
LINK可以定义f[i][j]f[i][j]f[i][j]表示第一个人上一次选的是pip_ipi,第二个人上一次选的是pjp_jpj,接下来游戏结束的期望值Ⅰ.当pi<pjp_i<p_jpi<pj时,显然此时应该是第一个人在选数f[i][j]=1+1c∑k>i&&pk>pjf[k][j]f[i][j]=1+\frac{1}{c}\sum\limits_{k>i\&\&p_k>p_j}f[k][j]f[i][j]=1+c1原创 2021-08-05 16:27:16 · 270 阅读 · 0 评论 -
2021百度之星初赛一 1003.鸽子(小dp)
LINK考虑定义f[i][j]f[i][j]f[i][j]表示考虑[1,i][1,i][1,i]的指令,现在坏电脑在jjj位置需要忽略的最少操作如果忽略这条指令显然有f[i][j]=f[i−1][j]+1f[i][j] = f[i-1][j]+1f[i][j]=f[i−1][j]+1如果不忽略这条指令考虑j==lij==l_ij==li,有f[i][j]=f[i−1][li]f[i][j]=f[i-1][l_i]f[i][j]=f[i−1][li]考虑j==rij==r_ij==ri,有f原创 2021-08-04 08:16:08 · 300 阅读 · 0 评论 -
The 2021 Shanghai Collegiate D. Zztrans 的班级合照(清新小dp)
LINK题意nnn个数字(彼此不同,就算大小相等也不同)分成大小为n2\frac{n}{2}2n的两个不递减序列,且第一个序列的每个位置都不小于第二个序列的对应位置求方案数我们先把数组aaa排个序,不排序怎么做T1T1T1如果没有两个序列对应位置的大小关系限制,那么很好做只需要考虑aia_iai是放在第一个序列还是放在第二个序列即可这样我们定义f[i][j]f[i][j]f[i][j]表示前iii个数,第二个序列放了jjj个第一个序列放了i−ji-ji−j个的方案但是又考虑到数字相原创 2021-07-13 21:45:06 · 819 阅读 · 0 评论 -
P4022 [CTSC2012]熟悉的文章(广义SAM+决策单调性)
LINK显然L0L_0L0有单调性,从而转化为判定性问题由于需要超过原串长度的90%90\%90%,不妨定义f[i]f[i]f[i]表示前iii个字符形成的最大熟悉字符使用后缀自动机可以预处理一个sufisuf_isufi表示最长可以使[i−sufi+1,i][i-suf_i+1,i][i−sufi+1,i]能匹配上原串先继承上一次的状态f[i]=f[i−1]f[i]=f[i-1]f[i]=f[i−1]若sufi>=L0suf_i>=L_0sufi>=L0令l=i−s原创 2021-07-13 21:17:36 · 199 阅读 · 0 评论 -
牛客IOI周赛27-提高组 C.马老师(容斥dp)
LINK如果在第iii个位置出现了第jjj位二进制111,那么[i,n][i,n][i,n]都有第jjj位二进制111于是定义f[i][j]f[i][j]f[i][j]表示当前考虑前iii位二进制,数列和为jjj的方案数有f[i][j]+=∑r=1nf[i−1][j−r∗(1<<i)]f[i][j]+=\sum\limits_{r=1}^{n}f[i-1][j-r*(1<<i)]f[i][j]+=r=1∑nf[i−1][j−r∗(1<<i)]暴力转移复杂度当然还原创 2021-07-13 20:19:11 · 262 阅读 · 0 评论 -
Codeforces Round #727 (Div. 2) E. Game with Cards(dp优化,从n^2到nlog到n)
题目链接另一种优化dp的解法T1T1T1非常显然有一个O(n2)O(n^2)O(n2)的dpdpdp,虽然它的复杂度高的吓人,但还是让我们小心翼翼的把它写出来定义f[0/1][i][j]f[0/1][i][j]f[0/1][i][j]表示前iii个操作后,第iii次何左手/右手交换,且另一只手上是第jjj次操作时的数该状态是否存在,这样就是傻瓜式转移然后考虑,这样设计状态是否合理?也就是f[0]f[0]f[0]和f[1]f[1]f[1]只需要维护是否可行,是一个010101数组我们只需要知道原创 2021-07-09 09:43:26 · 235 阅读 · 0 评论 -
牛客练习赛85 F.音游家的谱面(Hard version)(dp的多种优化)
LINK文章目录T1T1T1T2T2T2T3T3T3T1T1T1综合性很强的一题首先可以定义f[i][j][q]f[i][j][q]f[i][j][q]表示当前接到了[1,i][1,i][1,i]的音符,左手在jjj右手在qqq的最小时间但是发现想接到第iii个音符,必然有一只手在aia_iai位置所以重新定义f[i][j]f[i][j]f[i][j]表示当前接到了[1,i][1,i][1,i]的音符,一只手在aia_iai处,一只手在jjj处然后O(nm)O(nm)O(nm)枚举状态,原创 2021-06-28 00:00:55 · 336 阅读 · 1 评论 -
AtCoder Contest199 E - Permutation(状压dp)
LINK题意求[1,n][1,n][1,n]的满足一下条件的排列方案数对于mmm个限制,满足a1,a2...axia_1,a_2...a_{x_i}a1,a2...axi中至多有ziz_izi个数小于等于yiy_iyin<=18,m<=100n<=18,m<=100n<=18,m<=100比较裸的状压DP\rm DPDP吧定义f[i]f[i]f[i]表示填数状态为iii时的合法方案数,第jjj位二进制为111表示数字jjj已经被填过比如iii原创 2021-06-03 21:16:02 · 342 阅读 · 0 评论 -
1523 D. Love-Hate(随机+枚举子集或SOSDP)
LINK设答案子集为x,注意到有超过n2\frac{n}{2}2n(四舍五入)的人包括xxx我们从nnn个人随机选出一个人,这个人包含xxx的概率大于等于n2\frac{n}{2}2n多随机几次,意味着肯定随机到了参与答案的人。比如随机到的人编号是ididid,那么只考虑这个人喜欢的货币子集这样的子集只有不多于2152^{15}215个于是每个人只需要考虑是否包括这些子集现在我们只需要预处理一个f[mask]f[mask]f[mask]表示子集是maskmaskmask的有多少人这其实是原创 2021-06-02 15:53:08 · 369 阅读 · 0 评论 -
2020ICPC 昆明热身赛 C.Statues(小思维)
LINK因为雕像一定是重量从小到大放过来的所以只要直到之前放了几个雕像,就直到现在要放什么雕像定义f[i][j]f[i][j]f[i][j]表示前iii个位置放了jjj个雕像的最小代价一个简简单单的O(n2)O(n^2)O(n2)的dpdpdp就搞定了#include <bits/stdc++.h>using namespace std;#define int long longint n,k,f[5009][5009];typedef pair<int,int>原创 2021-06-01 22:08:42 · 299 阅读 · 0 评论 -
2019EC-final H - King(随机化dp)
LINKqai−1≡ai(mod p)qa_{i-1}≡a_i(\mod p)qai−1≡ai(modp)相当于在模ppp意义下找到一个最长的等比数列但是公比不知道,没办法写。观察到题目的特殊性(没发现),如果答案不超过n2\frac{n}{2}2n直接输出−1-1−1即可当答案超过n2\frac{n}{2}2n时,发现答案子序列中相邻的两个数不过隔得很远大部分的距离都小于等于222就算有两个数距离特别远达到xxx,那就有其他的数隔得非常近我们从原序列随机取两个数,都在答案序列中的原创 2021-05-26 12:44:08 · 344 阅读 · 0 评论 -
2020 CCPC 长春 J. Abstract Painting(状压dp)
LINK顺序考虑区间上的每个点作为圆的右端点,定义f[i]f[i]f[i]表示[0,i][0,i][0,i]的方案数考虑iii点之前有一个直径为[x−r,x+r][x-r,x+r][x−r,x+r]的圆(x+r<ix+r<ix+r<i)当以iii为右端点放直径为[l,i][l,i][l,i]的圆时, 显然lll不能是[x−r+1,x+r−1][x-r+1,x+r-1][x−r+1,x+r−1]中的任意一点只要满足这个条件,交点数一定小于等于111然后注意到半径不超过555,所以以原创 2021-05-25 16:26:29 · 466 阅读 · 0 评论 -
2018-2019 ACM-ICPC, China Multi-Provincial Collegiate G. Factories(树形dp+算贡献)
LINK题意给定一颗nnn个节点的边权树,在kkk个叶子节点建立工厂令两两工厂的距离和最小,求出最小距离和定义f[i][j]f[i][j]f[i][j]表示iii的子树内选择jjj个叶子节点的距离和转移为f[u][i]=min{f[son][j]+f[u][i−j]+g[u][i−j]∗g[v][j]}f[u][i]=\min\{f[son][j]+f[u][i-j]+g[u][i-j]*g[v][j]\}f[u][i]=min{f[son][j]+f[u][i−j]+g[u][i−j]∗g[原创 2021-05-18 21:54:39 · 285 阅读 · 0 评论 -
45届ICPC亚洲区域赛(上海)C.Sum of Log(卡常数位dp)
LINK若(x,y)(x,y)(x,y)满足x&y=0x\&y=0x&y=0那么可以被计算贡献贡献为二进制位的最高位的位数那么容易想到定义f[i][j][0/1][0/1]f[i][j][0/1][0/1]f[i][j][0/1][0/1]表示枚举到第iii位,最高位二进制111是jjj位置xxx卡不卡上界,yyy卡不卡上界这样乍一看是非常优秀的复杂度,然而实际上算一下发现极限数据是302∗22∗105=3.6∗10830^2*2^2*10^5=3.6*10^8302∗2原创 2021-05-11 22:26:06 · 291 阅读 · 0 评论 -
(ICPC)亚洲区域赛(济南) L.Bit Sequence(数位dp,压缩状态)
LINK乍一看觉得非常不可做,因为似乎找不到什么比较小的状态能判断是否满足条件如果能找到这样的状态就简单了,在递归出口写个判断函数返回即可观察到我们需要对i∈[0,m)i\in[0,m)i∈[0,m)判断f(x+i)==aif(x+i)==a_if(x+i)==aix+ix+ix+i会不断进位,一旦进位就没完没了了但是m<=100m<=100m<=100,也就是最多影响xxx的后777位二进制换句话说,对于任意的i∈[0,m)i\in[0,m)i∈[0,m),无法就两种情况原创 2021-05-11 17:09:31 · 407 阅读 · 0 评论 -
ICPC亚洲区域赛(南京) M.Monster Hunter(树形dp)
LINK转化题意,把每个点的权值放在自己和父亲上计算①.树形背包解法那么其实这是一个树型dpdpdp的过程定义f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示子树中jjj个点没有被删去(也就是选择了jjj个点)的最小权值和那么初始化f[u][0][0]=0,f[u][1][1]=wuf[u][0][0]=0,f[u][1][1]=w_uf[u][0][0]=0,f[u][1][1]=wu这样刚好和背包的定义吻合但是这样dpdpdp数组的定义刚好和题意相反,所以需要原创 2021-05-10 22:41:59 · 386 阅读 · 0 评论 -
2019牛客国庆集训派对day3 排列(状压dp)
LINK状压每个位置是否被填充数字考虑从小到大把数字填充进去,这样就可以去掉绝对值符号#include<bits/stdc++.h>using namespace std;#define int long longconst int inf = 1e18;const int maxn = 1<<21;int n,m,a[maxn],b[maxn],z[maxn],y[maxn];int bit[maxn],sumz[maxn],sumy[maxn],p[22],f[原创 2021-05-09 16:13:59 · 235 阅读 · 0 评论 -
2019牛客国庆集训派对day1 D.Modulo Nine(巧妙的dp)
LINK考虑这么多限制很不好做,而且区间可能彼此嵌套,无法同时满足限制考虑一段区间乘机模999为零有什么特殊点.其实就是分解质因子之后,至少有两个因子都为333那么我们在第iii位填充了3,63,63,6后,相当于在这个位置设置了一个因子333我们在第iii位填充了9,09,09,0后,相当于在这个位置设置了两个因子333所以我们对于每个位置iii,考虑它作为限制区间的右端点,那么若干个左端点只有最右的区间有用所以我们定义f[i][j][k]f[i][j][k]f[i][j][k]表示填充了[原创 2021-05-06 22:07:02 · 278 阅读 · 0 评论 -
F. Music Festival(dp的优化)
LINK定义f[i][j]f[i][j]f[i][j]表示时间[1,i][1,i][1,i]内,覆盖舞台情况为jjj能得到的最大收益我们先把时间离散化,这样最多只有2∗∑Mi2*\sum M_i2∗∑Mi个不同点,所以状态数是2∗∑Mi∗2N2*\sum M_i*2^N2∗∑Mi∗2N转移需要枚举一个节目,当然这个节目的结束时间应该小于等于jjj这个转移复杂度为O(∑Mi)O(\sum M_i)O(∑Mi),看起来无法通过我们可以只转移以时间iii结束的那些节目,至于之前的节目,直接继承就好原创 2021-05-01 15:46:57 · 257 阅读 · 0 评论 -
P3989 [SHOI2013]阶乘字符串(思维状压dp)
LINK先建出序列自动机,那么可以在字符集的时间内判断一个串是不是阶乘字符串如果枚举排列去验证复杂度不对,考虑dpdpdp然后发现状态的定义几乎只能这么定义f[i][s]f[i][s]f[i][s]表示前iii个字符满足状态为sss的字符集的阶乘字符串但是发现并不好转移,在原来的基础上加入新的字符,无法判断是否能转移重新定义状态f[s]f[s]f[s]表示字符集为sss的阶乘字符串最早满足的位置是[1,f[s]][1,f[s]][1,f[s]]f[s]f[s]f[s]可以由状态f[a1],f原创 2021-04-28 20:43:04 · 246 阅读 · 0 评论 -
2018 ACM-ICPC, Syrian Collegiate Programming Contest F. Pretests(子集dp)
LINK题意一道题有kkk个测试点,共提交了nnn次每次提交是一个长为kkk的010101串,表示是否能通过第iii个测试点现在要求你重新排序kkk个测试点,使得∑i=1nw[i]\sum\limits_{i=1}^nw[i]i=1∑nw[i]最小其中w[i]w[i]w[i]指的是第iii个人第一次在第几个测试点wrong answerwrong\ answerwrong answer了输出字典序最小的方案数考虑定义f[i]f[i]f[i]表示当放置测试点状态为iii时原创 2021-04-25 17:53:46 · 261 阅读 · 0 评论 -
Codeforces Round #715 (Div. 2) C. The Sports Festival(区间dp)
LINK先对aaa数组排序设第一个数放的是axa_xax那么第二个数必然是ax−1a_{x-1}ax−1或ax+1a_{x+1}ax+1如果不是这两个数,比如是ax+2a_{x+2}ax+2,那么必然用ax+1a_{x+1}ax+1替换更加优秀因为先放ax+2a_{x+2}ax+2上去只是让最大值变得更大了,并没有什么好处所以我们放置的数字一定是一段一段连续的,要么往左边扩展,要么往右边扩展定义f[i][j]f[i][j]f[i][j]表示当前已经放了[i,j][i,j][i,j]原创 2021-04-19 16:22:39 · 225 阅读 · 0 评论