
动态规划
mayaohua2003
这个作者很懒,什么都没留下…
展开
-
Codeforces gym 100531 E
不想再碰第二次的题目。首先我们需要对正则表达式建出对应的ϵ−NFA\epsilon-NFAϵ−NFA,这个就按正常的正则表达式解析就行。这里ϵ−NFA\epsilon-NFAϵ−NFA上的每条转移弧长度是000(ϵ\epsilonϵ)或111(字符)。不过我第一次写,出了一堆问题。这里的正则表达式允许空串,于是有可能出现连续的运算符。同时我按lrj书上介绍的方法把一些点合并了,然后WA爆了,不知道是我实现错了还是确实不可以,最后改成暴力做法才过。接着考虑怎么解决原问题。显然直接DP即可,令fi,jf_原创 2020-12-25 22:47:25 · 469 阅读 · 0 评论 -
Codeforces gym 101173 I
比较麻烦的DP。预处理出来transi,j,ktrans_{i,j,k}transi,j,k表示提示iii和jjj同向,接下来的序列会从iii的初始位置开始并匹配完iii,且jjj已经匹配了前k−1k-1k−1个是否会合法。然后考虑做一个DP,从左往右依次加入数字。令fst,lv,ld,rv,rdf_{st,lv,ld,rv,rd}fst,lv,ld,rv,rd表示现在已经确定了集合ststst中的提示;现在从右往左的下一个提示是lvlvlv,我们现在的序列匹配了lvlvlv的ldldld开始的后缀原创 2020-12-24 12:47:40 · 306 阅读 · 0 评论 -
Codeforces gym 101190 L
首先写一个DP。从小到大排列质数p1=2,p2=3,…p_1=2,p_2=3,\ldotsp1=2,p2=3,…。令fi,jf_{i,j}fi,j表示用≥pj\geq p_j≥pj的质数凑出总和iii的方案数,gi,jg_{i,j}gi,j为对应的长度和。那么可以发现101810^{18}1018对应的最大的总和kkk在200020002000左右,可以承受。然后可以类似数位DP的思路来输出答案了:我们枚举总和,然后由于总和相同按字典序排列,因此可以从小往大搜索,记录当前前缀对应的数位和,如果中原创 2020-12-24 12:37:17 · 224 阅读 · 0 评论 -
UOJ 494
这是myy出的神仙题,我花了很多天时间才看懂题解。这份题解参考myy的官方题解和yhx的题解,大概算是后者的详细证明版本。我们接下来的定义都是在一个特殊的字典序意义下的,也就是一个串的前缀大于自身(也可以理解为给每个有限长字符串最后加一个U\tt{U}U,然后在通常字典序意义下比较)。另外我们定义两个字符串的严格<<<与严格>>>,字符串sss严格<t<t<t意味着存在位置i>0i>0i>0,使s[1…i−1]=t[1…i−1]s[1原创 2020-11-27 13:16:04 · 574 阅读 · 0 评论 -
Codeforces Round 1416 简要题解
A. k-Amazing Numbers略B. Make Them Equal略C. XOR Inverse略D. Graph and Queries处理仅含删边的图连通性问题,可以离线后倒着处理,转化为仅含加边的图连通性问题,可以简单地用并查集维护。不仅如此,我们还可以尝试对连通块的合并建出一个有根树森林,其中叶子节点是初始时的点,每次合并两个连通块新建一个点作为它们的共同父亲即可。这样,任意时刻某个连通块对应的点集对应某个子树,若我们只维护真实的节点,可以理解为dfs序上一段区间。这样问原创 2020-11-23 23:21:16 · 302 阅读 · 0 评论 -
Codeforces Round 1396 简要题解
A. Multiples of Length略B. Stoned Game略C. Monster Invaders问题可以转化为从level 111开始,每次花费ddd的时间移动到一个相邻的level,然后对于level iii,我们有两种选择:第一种是花费pi=r1ai+r3p_i=r_1a_i+r_3pi=r1ai+r3时间,需要至少经过level iii一次;第二种是花费qi=min(r1(ai+2),r1+r2)q_i=\min(r_1(a_i+2),r_1+r_2)qi=mi原创 2020-11-22 14:27:42 · 351 阅读 · 0 评论 -
Codeforces Round 1292 简要题解
A. NEKO’s Maze Game略B. Aroma’s Search略C. Xenon’s Attack on the Gangs略D. Chaotic V.vp的时候脑子抽了,不知道写了啥,最后也没过。令k=max(ki)k=\max(k_i)k=max(ki),考虑将1!∼k!1!\sim k!1!∼k!分解质因数,这里可以从小到大计算,每次在上次基础上分解最后一个数即可。将一个数xxx表示为每个质因子出现次数的集合(c1,c2,...,cm)(c_1,c_2,...,c_m)原创 2020-06-14 17:40:18 · 616 阅读 · 0 评论 -
Codeforces Round 1290 简要题解
A. Mind Control略B. Irreducible Anagrams略C. Prefix Enlightenment略D. Coffee Varieties (hard version)vp的时候智障的算错了常数,写了一个操作次数2n2k\frac{2n^2}{k}k2n2WA了,然后不想改了(虽然区别不大)。考虑分治,定义solve(l,r)返回一个l∼rl\sim rl∼r间的下标集合,使得[l,r][l,r][l,r]中每种不同权值恰好在这个下标集合中对应出现一次。令le原创 2020-06-14 15:25:49 · 346 阅读 · 0 评论 -
Codeforces Round 1299 简要题解
A.Anu Has a Function略B.Aerodynamic略C.Water Balancevp的时候猜了一下结论,答案满足每个位置被操作恰好一次,那么显然就是对(i,∑j=1iaj)(i,\sum_{j=1}^{i}a_j)(i,∑j=1iaj)的下凸壳上相邻两个点间操作即可,建出下凸壳就做完了。vp完后看了一下题解的证明,挺有意思的。最小化aia_iai的字典序等价于最小化pi=∑j=1iajp_i=\sum_{j=1}^{i}a_jpi=∑j=1iaj的字典序。同样把原创 2020-05-26 10:53:46 · 342 阅读 · 0 评论 -
Codeforces Round 1338 简要题解
A. Powered Addition略B. Edge Weight Assignment略C. Perfect Triples找找规律容易发现答案跟四进制相关。考虑将数字写成四进制,容易观察并归纳证明:所有匹配的(a,b,c)(a,b,c)(a,b,c)位数都相同,并且位数相同,最高位为111,222和333的数字分别会作为aaa,bbb和ccc出现,互相匹配,且aaa从小到大取遍所...原创 2020-04-17 23:00:19 · 449 阅读 · 0 评论 -
Atcoder agc041简要题解
A - Table Tennis Training略B - Voting Judges略C - Domino Quality当N≤3N\leq 3N≤3时特判。经过一些构造,可以在N=4,5,6,7N=4,5,6,7N=4,5,6,7时都构造出每行每列恰有333个的方案,具体构造的方案可以看代码。注意到在NNN的一个每行每列恰有333个的方案右下方放一个N=4N=4N=4的方案,就可以...原创 2020-04-06 23:31:28 · 642 阅读 · 0 评论 -
Codeforces Round 1322简要题解
做手速狗的一场,E差5min调出来,不过还是苟到了rk4。A. Unusual Competitions略B. Present略C. Instant Noodles令C(S)=∑i∈SciC(S)=\sum_{i \in S}c_iC(S)=∑i∈Sci,即f(S)=C(N(S))f(S)=C(N(S))f(S)=C(N(S))。根据容斥原理,我们知道f(S)=C(N(S))=∑...原创 2020-03-24 21:36:20 · 666 阅读 · 0 评论 -
Codeforces 613E
令两个串分别为s1s_1s1和s2s_2s2。设F[i][j][0/1][0/1]F[i][j][0/1][0/1]F[i][j][0/1][0/1]表示当前起点为s1s_1s1或s2s_2s2的前/后第jjj列(仅在前/后jjj列中匹配),从第iii个位置开始匹配完www的方案数,预处理一些lcp的信息即可快速计算。再考虑计算答案。忽略仅在s1s_1s1或s2s_2s2中选的平凡情...原创 2020-03-05 22:59:46 · 261 阅读 · 0 评论 -
Atcoder agc036D
没有负环可以理解为能够给第iii个点一个距离值did_idi。由于iii到i+1i+1i+1有000边,因此di≥di+1d_i\geq d_{i+1}di≥di+1,且由于边权绝对值不超过111,因此di≤di+1+1d_i\leq d_{i+1}+1di≤di+1+1。为了使距离值合法,对于j<ij<ij<i,若dj=did_j=d_idj=di,不能有−1-1...原创 2020-03-05 14:31:18 · 324 阅读 · 0 评论 -
Atcoder agc027E
先考虑如何判定能否将字符串缩为单个字符。考虑将aaa当做111,bbb当做222,这样每次操作后,总和在 mod 3\bmod \ 3mod 3意义下不变,那么有解需要和在 mod 3\bmod 3mod3意义下不为000。并且若串长>1>1>1,需要有两个相邻的相同字符,容易归纳证明这个条件也是充要的,当存在两种字符时,每次操作一个abbabbabb类似的...原创 2020-03-05 14:03:21 · 304 阅读 · 0 评论 -
Atcoder agc028D
如果使用类似agc039E的方法,由于已经给定了一些边,并不容易讨论。我们发现一个连通块事实上在圆上对应着一个区间[l,r][l,r][l,r](l<rl<rl<r),其中内部的点两两匹配,另外不存在l<k<rl<k<rl<k<r,使得[l,k][l,k][l,k]内部的点两两匹配。于是可以考虑对出度dp,枚举左端点lll,设F[i][j]F...原创 2020-03-05 11:55:31 · 288 阅读 · 0 评论 -
Codeforces 605E
设F[i]F[i]F[i]表示从iii号点出发到nnn号点最小期望时间。类似dijkstra算法,按FFF值从小往大确定每个点的最小期望时间并更新即可。时间复杂度O(n2)\mathcal O(n^2)O(n2)。#include <bits/stdc++.h>#define eps 1e-8using namespace std;typedef double db;...原创 2020-03-05 11:47:23 · 230 阅读 · 0 评论 -
Atcoder agc024E
倒着考虑,从一个给定的ANA_NAN不断删除字符能得到多少种不同的方案。为了不计重复,我们要求每次删掉一个字符xix_ixi时,满足xi+1≠xix_{i+1}\neq x_ixi+1=xi,那么合法的条件是∃j≥i,xi=xi+1=...=xj,xj+1<xi\exist j\geq i,x_i=x_{i+1}=...=x_j,x_{j+1}<x_i∃j≥i,xi=xi...原创 2020-03-05 11:22:12 · 293 阅读 · 0 评论 -
Atcoder agc037F
可以发现如果一个区间(l,r)(l<r)(l,r) (l<r)(l,r)(l<r)能合并,那么一定存在一个方案使得合并成的level为maxi=lrAi+1\max_{i=l}^{r}A_i+1maxi=lrAi+1。考虑递归计算区间(l,r)(l,r)(l,r)的答案。当(l,r)(l,r)(l,r)不为平凡区间时,取出其中所有的最大值xxx,它们将(l,r)(l,r)...原创 2020-03-05 10:25:23 · 456 阅读 · 0 评论 -
Atcoder arc093F
简单的容斥DP。显然111所在位置是不重要的,不妨设p1=1p_1=1p1=1。那么我们可以发现111要比赛的人是另外NNN个大小分别为202^020,212^121,.........,2N−12^{N-1}2N−1的有序集合的最小值。111能获胜即等价于这些集合的最小值均不为AiA_iAi。直接算不好做,考虑容斥,钦定若干个AiA_iAi为某些集合的最小值。按iii从大往小考虑,设F...原创 2019-12-10 23:35:29 · 234 阅读 · 0 评论 -
Codeforces 708E
每行最后会剩下的显然是一个区间(可能为空),那么连通的条件即为每行剩余的区间非空,且相邻两行的区间均有交。先预处理出最终某行某一侧恰好删去了kkk个元素的概率。设F[i][j]F[i][j]F[i][j]表示仅考虑前iii行,它们连通且第iii行剩余区间的右端点为jjj的概率,注意左右端点是对称的。直接转移有点吃力,可以考虑简单的容斥一下,用前i−1i-1i−1行连通,且第iii行剩余区间左端点...原创 2019-12-10 23:24:23 · 250 阅读 · 0 评论 -
Atcoder agc028F
考虑从大往小枚举左上角(i,j)(i,j)(i,j),求出所有能到达的点的权值和sum[i][j]sum[i][j]sum[i][j]。如果(i,j+1)(i,j+1)(i,j+1)和(i+1,j)(i+1,j)(i+1,j)中至多只有一个非障碍格子,那么容易计算。否则直接加上sum[i][j+1]sum[i][j+1]sum[i][j+1]和sum[i+1][j]sum[i+1][j]sum[...原创 2019-12-06 21:46:52 · 725 阅读 · 0 评论 -
Atcoder arc101E
简单的容斥DP。考虑容斥,钦定某些边不被任何路径经过。这样就将原树分为了若干个连通块,每个连通块内部需要两两匹配,注意这样的每个连通块需要有偶数个点。考虑DP,设F[i][j]F[i][j]F[i][j]表示考虑以点iii为根的子树,iii所在的连通块有jjj个点,除iii所在的连通块以外的点已经容斥后匹配好了的贡献。转移的时候大致是合并若干个子树的背包,并讨论一下跟父亲的边是否容斥掉即可。...原创 2019-12-06 19:38:50 · 304 阅读 · 0 评论 -
Codeforces 585F
真实迷惑题,这个3200分不知道是怎么标上去的。考虑计算出不是half-occurrence的串数目。把所有sss长度为⌊d2⌋\lfloor \frac{d}{2}\rfloor⌊2d⌋的子串插入一个AC自动机,然后对xxx和yyy做个数位DP即可。DP的时候需要预处理出F[i][j]F[i][j]F[i][j]表示当前在AC自动机上的节点iii,走jjj步后仍然没有包含任何一个sss长度为...原创 2019-12-06 19:03:39 · 169 阅读 · 0 评论 -
Atcoder agc036F
当时改题的时候没有意识到这个奇怪题意给出的性质,结果完全不会。这个问题本身大致是一个不太可做的完美匹配计数,不过我们注意到对于每个iii,它能匹配到的PiP_iPi是一个区间[Li,Ri][L_i,R_i][Li,Ri],且LLL与RRR均单调不增。如果所有iii均有Li=0L_i=0Li=0,那么我们容易对RiR_iRi排序后O(N)\mathcal O(N)O(N)计算。考虑一...原创 2019-12-01 17:13:02 · 266 阅读 · 0 评论 -
Atcoder arc100F
正难则反,考虑计算所有不colorful的序列SSS的贡献和。我们称一个序列是diff的当且仅当它不存在两个值相同的元素,那么colorful的定义就是包含一个长度为KKK的diff序列。先预处理出F[i][j]F[i][j]F[i][j]表示长度为iii且不colorful的序列中有多少个包含结尾的极长diff子序列长度恰为jjj的。这个可以用简单的DP实现。我们可以注意到一个事实,所有不...原创 2019-12-01 15:12:26 · 293 阅读 · 0 评论 -
Codeforces 704C
很恶心人的题。我们考虑把每个变量当做无向边,那么每个点的度数至多是222。因此每个连通块忽略自环后都是链或环,都可以用DP求出来答案。大概对于链的话,记录F[i][j=0/1][k=0/1]F[i][j=0/1][k=0/1]F[i][j=0/1][k=0/1]表示考虑到链的第iii个位置,上个变量的取值为jjj,目前已经确定的子句的异或和为kkk,转移直接枚举下一个变量的取值即可。环的话找一个...原创 2019-12-01 14:36:34 · 277 阅读 · 0 评论 -
Codeforces 568E
怎么还有卡空间题。。。设原来给定的序列为aaa,能填的序列为bbb。考虑经典LIS的O(nlogn)\mathcal O(n\log n)O(nlogn)做法,我们维护了一个数组F[i]F[i]F[i]表示长度为iii的上升子序列的最小结尾,每次可以二分。我们可以魔改一下这个做法,对于ai≠−1a_i \neq-1ai=−1的位置仍然二分,对于ai=−1a_i=-1ai=−1的位置我...原创 2019-12-01 14:30:55 · 244 阅读 · 0 评论 -
Atcoder agc032D
这题有个一眼的dp式,设F[i][j]F[i][j]F[i][j]表示将原序列中权值在[i,j][i,j][i,j]中的点排序的最小代价,转移直接枚举一下左右端点。很可惜是假的,可以被5 1 2 3 4 7 8 9 10 6这种数据卡掉。考虑靠谱的做法,每次旋转只会改变一个数和其他数的相对位置,所以如果改变一个数的相对位置,一定会改到最终的位置。那么设F[i][j]F[i][j]F[i][j...原创 2019-11-26 22:17:12 · 293 阅读 · 0 评论 -
Atcoder agc039E
考完试才发现E是简单题。。。思考一下怎么样是合法的生成树。不妨设111号点跟kkk号点匹配,那么对于区间[2,k−1][2,k-1][2,k−1]和[k+1,n][k+1,n][k+1,n],我们会各自按顺序分成ccc段,每一段内部有奇数个点,其中其他点内部匹配,伸出一个点跨越中间的边跟另一边的一段伸出的一个点匹配,并且匹配的段是按跟111号点距离一一对应的。那么看起来就可以DP了,我们设F[...原创 2019-11-26 21:28:42 · 442 阅读 · 0 评论 -
Codeforces 582E
对于一个表达式,我们可以记录444个变量的每种不同取值(共24=162^4=1624=16种)所对应的不同结果,于是可以把一个表达式看成一个长度为161616的二进制串,这样的串总共有2162^{16}216种。回到原问题,我们把表达式树建出来,对每个节点xxx维护子树中的表达式不同填法所对应的每种二进制串ststst的个数F[x][st]F[x][st]F[x][st]。那么考虑xxx处填的符...原创 2019-11-26 21:08:51 · 186 阅读 · 0 评论 -
Atcoder agc020E
这题看上去就有一股乱搞的感觉。注意到答案显然可以DP,对于一个字符串SSS,我们令F[S]F[S]F[S]代表SSS的所有子集的编码方案数之和。那么考虑最左边被编码的是哪个子串,有F[S]=(1+[S1=1])⋅F[S2...∣s∣]+∑ij≤nF[S1...i and Si+1...2i and ...S(j−1)i+1...ij]⋅F[Sij+1......原创 2019-11-26 20:59:28 · 360 阅读 · 0 评论 -
Atcoder agc030F
我们忽略掉A2i−1A_{2i-1}A2i−1和A2iA_{2i}A2i均不为−1-1−1的iii,称最终序列中相邻两个数为一对匹配。考虑从大到小分配权值,每对匹配只有在较小的权值出现的时候才确定相对顺序。设F[i][j][k]F[i][j][k]F[i][j][k]表示考虑了不小于iii的权值,剩余没匹配的权值中恰有jjj个出现在AAA序列中,恰有kkk个没出现在AAA序列中。转移的时候...原创 2019-11-23 23:34:19 · 292 阅读 · 0 评论 -
Atcoder agc026D
O(nlogV)\mathcal O(n\log V)O(nlogV)出n=100n=100n=100的出题人nb。对于一个2⋅22\cdot 22⋅2的矩阵,其中黑白格子数目相同的等价条件是考虑四个相邻格子的异或和,那么相对的两组异或和分别相等,且不能四个异或和均为000。考虑如果给定的网格是n⋅mn\cdot mn⋅m的矩阵,我们确定了第一行和第一列的差分异或和的话,之后的每行每列也必须...原创 2019-11-23 23:06:52 · 596 阅读 · 0 评论 -
Atcoder arc089F
挺棒的计数题。先考虑给一个方案,如何判定它能否被构造出来。显然’w’会把方案分成若干段,每段是独立的。对于某一段,如果只有’r’,那么恰好需要一次’r’操作,否则存在’b’的话就需要先做一次’r’操作,接着再做一次’b’操作,接下来考虑段内的’b’连续段数目为ddd,那么我们显然需要再做至少d−1d-1d−1次操作,事实上,这d−1d-1d−1次操作是’r’还是’b’是无关紧要的,我们容易构造出...原创 2019-11-23 22:39:33 · 540 阅读 · 0 评论 -
Codeforces 582D
有一个叫库默尔定理的东西,说的是(nm){n}\choose{m}(mn)中质数ppp的指数为mmm和n−mn-mn−m在ppp进制下相加进位的次数,证明比较容易就不说了。有了这个定理就比较好做了,我们先将输入的AAA写成ppp进制,记位数为kkk。我们从低位往高位做数位DP,记录F[i][j][0/1]F[i][j][0/1]F[i][j][0/1]表示只考虑最低的iii位且nnn不超过AA...原创 2019-11-23 21:06:54 · 202 阅读 · 0 评论 -
Codeforces 704B
似乎是个经典的套路?大概对这类数轴上哈密顿回路问题都能这么做。我们可以将一条路径拆分成若干段来回经过相邻两条边的方案,那么大概就变成了一个类似插头DP的东西。我们考虑DP,设F[i][j][k]F[i][j][k]F[i][j][k]表示从左到右考虑了前iii个点,对于[i−1,i][i-1,i][i−1,i]之间的边,我们从左向右经过了jjj次,从右向左经过了kkk次,转移的时候考虑经过[i,...原创 2019-11-23 20:41:18 · 306 阅读 · 0 评论 -
Atcoder agc035E
好题。先考虑给定一个删除的元素集合,怎么判断是否能构造出来。对于一个给定的能构造出某个集合的最短操作序列,我们发现每个元素被删除后就不会再加入了,否则可以得到更短的操作序列。那么对删除的元素集合中,若存在两个数uuu和vvv,且v=u+2v=u+2v=u+2或v=u−Kv=u-Kv=u−K,我们就从uuu往vvv连一条边,可以构造出来当且仅当这样得到的图是DAG。若KKK为偶数,显然可以分开奇...原创 2019-11-13 22:12:05 · 412 阅读 · 0 评论 -
Atcoder arc096F
不会算复杂度了,写了个O(n5)\mathcal O(n^5)O(n5)以为是O(n4)\mathcal O(n^4)O(n4)的,交上去T飞了。我们可以转化一下问题,可以不断选择某个子树,除了111号点子树以外其他子树每个最多选DDD次。选择xxx号点子树需要花费子树内权值和的代价WxW_xWx,得到子树大小的价值VxV_xVx,问代价不超过XXX的最大价值。这个看起来是一个NPC的背包...原创 2019-11-11 21:16:47 · 365 阅读 · 0 评论 -
Atcoder agc033D
答案显然是O(logn)\mathcal O(\log n)O(logn)级别的,并且有很强的单调性。考虑一轮轮的做,设F[i][j][k]F[i][j][k]F[i][j][k]表示左上角为(i,j)(i,j)(i,j),右上角为(i,k)(i,k)(i,k)的矩形,用不超过TTT轮最多覆盖多少行。由TTT推到T+1T+1T+1的时候有两种转移,一种容易处理,另一种网上很多题解说要二分,其...原创 2019-11-10 21:47:01 · 503 阅读 · 1 评论