2020集训队作业板刷记录(二)

继续

ARC096F

传送门

不会

首先可以转化为每个点的代价是子树里所有代价之和,价值是子树的节点个数,(1)号点可以选任意个,其他点最多选(d)个,求最大价值

先考虑一个贪心,记(w_i)为代价,(v_i)为价值,先把所有点按(w_iover v_i)降序排序,然后从前往后贪心选。这样贪心肯定是错的,不过我们发现,由于(v_ileq 50),如果存在某个(i<j),且(i)还能选的次数大于等于(50)(j)已经选的次数大于等于(50),那么我们可以让(i)再选(v_j)次,让(j)选的次数减少(v_i)次,这样总的价值是不变的,但是代价减小了,所以一定不会存在这种情况

所以上面那种情况一定不存在了,我们可以把每个物品分成两部分,一部分最多只有(50)个,另一部分就是减去前面那部分。前一部分的价值最大只有(O(n^3)),那么我们可以直接背包算出(f_i)表示价值为(i)时的最小代价,然后枚举在这一部分里的价值,剩下的就可以在另一部分里贪心了

CF704D

传送门

类似CF574D,跑个上下界最大流就行了,然后把选出来的全都设为较为便宜的那种颜色

CF576E

传送门

线段树分治,用可持久化并查集维护即可

AGC027D

传送门

不会

首先把网格黑白染色,那么相同颜色的点互不影响,如果我们令(m=1),且白点的权值都已经确定,那么黑点的权值可以设成它周围四个白点权值的(lcm +1),对于白点的权值,我们可以对于每一条主对角线和每一条副对角线各给一个素数,一个白点的权值就是所在主对角线和副对角线的权值之积,这样就行了

AGC030E

传送门

由于某些原因,这题咕咕咕了

CF516E

传送门

首先按模(gcd)分类,不同类之间互不影响,同一类里,我们发现如果一个(A)类的人(i)(t)时刻是开心的,那么它可以在(t+n)时刻令((i+n)\%m)的人开心,最终可以全都转化为只考虑初始开心的人了,然后相当于要跑个最短路,而这个最短路实际上是一个大圆环,那么把环上所有关键点找出来就行了,每两个点之间的距离用逆元算一下就行了

太麻烦了不想写了

AGC025D

传送门

不会

考虑(D=d^2=x^2+y^2),如果(Dequiv 1pmod{2}),那么(x,y)一定一奇一偶,我们棋盘状黑白染色,如果(Dequiv 2pmod{2}),那么(x,y)都是奇数,我们每隔按行的奇偶性染色,如果(Dequiv 0pmod{2}),我们把(D)除以(4)然后递归,如果(Dequiv 3pmod{2}),这种情况不存在

对于(D_1)(D_2)都这么来一次就行了,然后把所有没染色过的点输出,可以证明一定大于等于(n^2)

AGC035E

传送门

写过 这里

CF578E

传送门

发现贪心是正确的,那么我们转化成最少能分成多少条(01)相间的串,然后分类讨论一下就行了

ARC099D

传送门

不会

其实并不难,我们把最终的序列给哈希起来,那么就相当于查询有多少子序列哈希值等于原串哈希值,类似于求子串哈希值搞一搞就行了

CF704B

传送门

不会

我们先建出(s o e)的链表,然后从(1)(n)依次把每个数加入,且每个数都加入到当前最优的位置,可以通过分类讨论证明这样一定是正确的

CF578F

传送门

不会

首先我们把所有的格点黑白染色,那么镜子连接的点颜色一定相同,如果一块镜子是连接两个黑点就把这两个点连边,那么一棵黑点的生成树一定是一个合法的方案。确切来说,一个合法的方案一定唯一对应一棵黑点或白点的生成树

这个可以这样证明,因为第二个条件等价于无环,而第一个条件,我们考虑边界上相邻的两个点,那么这两个点之间的那两条边的光一定是按照两个点在树上的路径走的,且这两条边互相到达

由于不确定的镜子个数只有(200)个,那我们缩点,总的点数就只有(401)个了,跑个生成树就行了

AGC020D

传送门

写过 这里

CF634F

传送门

我们假设固定了矩形的上边界(l),考虑下边界(r)(n)变到(l)时答案会发生什么变化

我们先把在([l,n])范围内有点的那几列抠出来,每一列设一个(f_i)表示当所选矩形有点的第一列为(i)时的方案数,那么离散化之后,可选的左边界就是(i)(i-1)之间的列数,对于可选的右边界,我们设一个(to_i)表示满足最小的数满足([i,to_i])之间的点数大于等于(k),那么右边界的方案数就是(m-to_i+1)。我们发现一个事情,离散化之后,(to_ileq i+k-1)一定成立

然后考虑当下边界逐渐变化时,相当于删去某一行,那么对于某一列,它的点数减一。我们可以用一个链表来维护此时有点的列,如果该列点数减一后消失就把它从链表中删去,而我们需要更改前面的数的(to_i),那么最多只需要更改前面的(k-1)个数和自己的(to_i)就够了。以及如果该列删去,那么顺便改一下它后面那一列的可选左端点。总复杂度(O(nmk))

CF582D

传送门

不会

冷静分析一波,我们发现({nchoose k})(p)的次数为(sum_i leftlfloor{nover p^i} ight floor-leftlfloor{kover p^i} ight floor-leftlfloor{n-kover p^i} ight floor),而这个东西当且仅当(p)进制下(n)(n-k)的第(i-1)位进位时为(1)否则为(0),所以(p)的次数就等价于(k,n-k)(p)进制下相加的进位次数

这个可以用数位(dp)解决,设(f_{i,j,k,l})表示我们从大到小考虑到第(i)位,总共进了(j)次位,(k=0/1)表示有没有卡到上界,(l=0/1)表示是否需要第(i-1)位进位。转移并不需要枚举第(i-1)位是多少,我们只需要分类讨论一下(n)(k)(i-1)位的取值范围即可

ARC089F

传送门

不会

对于所有(3^n)种序列中的任意一个,怎么判断它是否合法呢

第一步,先把连续的字母缩成一个

第二步,我们把(w)当做分隔符,考虑中间每一个串,记一个数字(x)表示至少需要多少次操作才能生成这个串,比方说(r)(1)(b,rb,br,rbr)(2)(brb,rbrb,brbr,rbrbr)(3)

然后我们发现,除了(x=1)之外,其它的串的操作序列一定是由一个(RB)加上(x-2)个任意操作构成的。我们如果知道了它的(x)集合,那么就可以通过组合数来算出最终的个数。所以我们按升序枚举(x)序列,然后判断每个是否合法并用组合数计入答案即可。事实上总共的合法序列个数只有(418662)种,所以不会(T)

然而怎么判断合法呢,我们把所有的(x)从大到小排序,对于每个(x)找到最左边的还没用过的(R)的位置,记做(f_i),再对于每个(xgeq 2)找到最左边的还没用过的(B),记做(g_i)且保证(g_igeq f_i),然后对于每个(xgeq 3)(>g_i)的位置中取出所有没有用过的位置看够不够就行了。正确性显然

CF698D

传送门

不会

我们依次判断每个怪是否能被射到即可,这个只要枚举射击的顺序,设为(p_1,p_2,..,p_k),那么就是要用(p_k)去射怪,(p_{k-1})去射(p_k)和怪之间的一个障碍……以此类推,由于这个搜索最多只有(O(k))层,所以复杂度是(O(k))的,那么总复杂度就是(O(n imes k! imes k))

AGC026D

传送门

不会

先来考虑是一个矩阵的情况,如果我们已经确定了下面一行,那么当前行有两种情况

(1.)每一列都与下一行对应列相反,显然可行

(2.)如果下一行是(ABAB..)或者(BABA..)的情况,那么每一列都与下一行对应列相同,这个也是可行的

于是我们可以在算出当前情况下最小的(h_i),然后以这样的(h_i)为分隔递归计算子矩形,算出(f)(g),分别表示子矩形最下面一行是/不是形如(ABAB..)的方案数,然后转移即可

CF526G

传送门

不会

首先可以发现,直径的某一个端点必然是会被选的,那么我们以直径任意一个端点为根,然后选出(2y-1)个叶子,那么一定存在一种匹配方案使得这(2y)个点的路径并是他们形成的虚树,先对于(y)(1)(n)都预处理出答案。预处理用线段树或者长链剖分+贪心都可以

然后考虑询问(x),如果(y)的最佳方案已经包括了(x),那么直接输出,否则我们肯定会选择一个(x)子树中深度最深的叶子,并去掉另外一个点,去掉的点会有以下几种情况

(1.)去掉第(y)个选的叶子

(2.)(u)(x)祖先中深度最大的且在前(y-1)次里被选的点,将(u)子树中深度最大的点删去

(3.)去掉根,选择直径的另外一个端点,贡献减去(dep_u)

分类讨论一下即可

AGC030F

传送门

不会

我们先把所有(a_{2i-1})(a_{2i})都有值的位置去掉,那么会剩下若干对((-1,-1))((x,-1))(其中所有((-1,-1))之间的位置关系先不考虑,最后把答案乘上一个阶乘就行)

我们把所有数按从大到小考虑,那么当一个组被填满的时候它的答案就出来了

(f_{i,j,k})表示填完了(geq i)的数,现在有(j)组填了一个非(x)数的对,以及(k)(x)数的对,考虑如何转移

如果(i)不是一个(x)数,那么它可以填入一个((-1,-1))对,到(f_{i,j+1,k}),也可以和(j)组中某一个对匹配,到(f_{i,j-1,k}),也可以和(k)组中某一个对匹配(不过这里的方案数要乘上(k),因为(k)的位置不同),到(f_{i,j,k-1})

如果(i)是一个(x)数,那么它可以自己构成一个(x)数的对,转移到(f_{i,j,k+1}),也可以和某个非(x)对匹配,转移到(f_{i,j-1,k})

CF521E

传送门

不会

不难发现,有解当且仅当存在两个环有边相交

我们可以先通过求出(dfs)树,并通过树上差分随便找出一条被至少两个环经过的边,然后从这个边下面那个点去(dfs)找到两条对应的非树边的起点记为(u)(u'),对应的非树边的终点记为(v)(v'),且假设(dep_v>dep_{v'})

那么最终的答案的起点就是(LCA(u,u')),终点就是(v),然后直接把路径取出来就行了

AGC020E

传送门

不会

我们直接把字符串拿来dp,设(f_{S})表示(S)及其所有子集的方案数,然后转移分两种情况,一是第一位不编码,二是第一位编码,此时我们枚举编码串长度和循环次数,然后把对应的子串(and)起来之后继续搜索就行。直接用(map)来存储并且记忆化搜索即可,据说状态数是(O(n^3+2^{nover 8}))

AGC039E

传送门

做过,这里

CF582E

传送门

不会

首先我们可以把这个表达式写成一个二叉树的形式,其中叶子节点是值,非叶节点是符号,由于(ABCD)总共只有(2^4=16)种不同的情况,所以我们可以设一个(f_{u,s})表示考虑到(u)这个节点,(s)是一个(16)位的二进制数,其中(s)的第(i)位为(1)当且仅当(ABCD)的取值是第(i)种情况时这个子树的值为(1),然后我们发现(f_{u,x|y}=f_{ls,x} imes f_{rs,y}),也就是说转移实际上是一个卷积,所以用(FWT)优化转移即可

AGC024D

传送门

不会

首先发现一点,设直径为(D)(边数),那么答案的下界是(D/2+1)(因为两棵树如果最大深度不同那么肯定不同构),而且这个下界很容易就可以达到

如果(D)是偶数,那么这棵树的中心就是一条边,我们把这条边的两个端点作为根分别考虑两棵子树,那么要求深度相同的点的子节点个数相同,算一下就行了

如果(D)是奇数,一种方法是以中心点为根,另一种方法是以某两个节点一起作为中心(满足两棵子树的最大深度都小于等于(D/2)),有可能回达到更小的叶子个数

AGC032D

传送门

不会

(f_{i})表示强制(i)不动,令前(i)个数有序的最小代价,新添加一个(p_{n+1}=n+1)之后(f_{n+1})就是答案了

(f)的更新,就是枚举上一个不动的元素(j),那么(f_i=f_j+[j+1,i-1])中比(p_i)大的元素个数( imes A+[j+1,i-1])中比(p_i)小的元素个数( imes B),时间复杂度(O(n^2))

CF538H

传送门

连边之后必须得是一个二分图否则无解,设这个二分图表示一个班的人数需要在([a,b]),另一个班的人数需要在([c,d])(单独的一个点只需要令(c=0,d=inf)即可)

我们划出一个坐标系,其中((x,y))表示(A)班有(x)人,(B)班有(y)人,那么这个二分图合法的范围就是两个矩形,一个是(xin [a,b],yin [c,d]),一个是(xin [c,d],yin [a,b]),那么我们的目的就是找出一个被所有的(n)组二分图覆盖的点

我们发现对于同一组二分图的两个矩形,要么不交,如果相交则可以拆成三个不相交的矩形。那么一个点被(n)组二分图覆盖等价于它被(n)个矩形覆盖,所以用扫描线处理即可

ARC100F

传送门

不会

首先答案就是(a)序列的总出现次数减去在不合法序列中的总出现次数,而前面那个的答案就是((n-m+1) imes k^{n-m})

考虑后面那个,分成三种情况考虑

(1.a)序列就是一个(color)序列,那么答案就是(0)

(2.a)序列中每个颜色只出现一次但是(m<k),我们设(f_{i,j})表示考虑前(i)个位置,当前极长没有重复颜色的后缀长度为(j)的方案数,转移如下

[egin{aligned} f_{i,j} leftarrow f_{i-1,j^prime} cdotegin{cases}0 & j^prime + 1 < j \k – j^prime & j^prime + 1 = j \1 & j^prime + 1 > jend{cases} end{aligned} ]

用后缀和优化就可以做到(O(nk))的复杂度

同理我们可以设一个(g_{i,j})表示在这种情况下长度为(m)的没有重复颜色的区间个数,转移类似,注意如果(jgeq m)要让(g_{i,j}+=f_{i,j}),算出最终的(g)后让答案除以({k!over (k-m)!})即可

(3.)否则的话,我们设(l)表示极长没有重复颜色的前缀长度,同理设(r)表示后缀长度,初始值令(f_{0,0..l}=g_{0,..r}=1),然后将(f)(g)都按照(2)中的(f)进行转移即可(注意这里的(g)不是上面的(g),严格来说它和(f)的意义是一样的,也代表方案数),枚举(a_{1...m})的开头位置,最终的答案就是

[egin{aligned} left(sum_{j=0}^{k-1} f_{i-1,j} ight)left(sum_{j=0}^{k-1} g_{n-(i-1)-m,j} ight) end{aligned} ]

CF704C

传送门

细节恁多……

我们把一个表达式当成一个点,如果一个值同时出现在两个表达式里,就在这两个点之间连一条边,权值为(0/1)(如果两个值同为(x_i)(-x_i)就为(0)否则为(1)),由于每个点度数小于等于(2),所以这个图是由若干个环和链和孤立点构成的,我们分别考虑

(1.)孤立点,分别考虑孤立点有一个和两个元素的情况就是了,注意两个同样的(x_i)相当于只有一个,一个(x_i)(-x_i)那么肯定会为答案贡献(1)直接加上

(2.)链,我们设(f_{i,j,k})表示考虑了从左到右前(i)条边的取值,其中第(i)条边权值为(j),点([1,i+1])中所有点的权值异或和为(k)的方案数,转移枚举第(i+1)条边的取值即可。注意,度数为(1)的点有可能会有两个元素,所以链的开头和结尾要特殊考虑一下

(3.)环,先随便找一个当做环的开头,我们设一个(g_{i,j,k,l}),前三个同理,(l)表示环的开头的那一条边选的是(0/1),这样我们做到环的最后一条边时也不会出问题了

CF568E

传送门

不会

对于每一个(a_i eq -1)的点,设一个(l_i)表示以(a_i)结尾的(LIS)的长度以及(p_i)表示上一项的位置

然后设一个(f_i)表示长度为(i)(LIS)的结尾最小值以及(g_i)表示最小值的位置(就是(O(nlog n))(LIS)时的那个数组)

(b)排个序,由于(LIS)中不存在相等的数所以一个数填两次对答案没有影响,那么可以忽略每个数只能填一次这个限制

如果(a_i eq -1)直接转移,否则我们枚举这个位置填什么,用指针来维护(f_i)(g_i)的更新

最终还原答案,如果(a_i eq -1)直接回到(p_i),否则我们查找在([1,i-1])范围内是否有(a_j<a_i)(l_j=l_i-1)如果有那么上一个就是(j),否则就是上一个(-1)的位置,值就是小于当前值的最大元素

然后剩下的空随便填就行了

原文地址:https://www.cnblogs.com/yuanquming/p/12036663.html