题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)

前言:做个ABCE就自觉爬了。。蓝色标题是考场切的绿色标题是不看题解补的紫色标题是看题解补的或者弃坑的。。

(A)

题意:给定(n,k),问(n)是否能被(k)个互不相同的奇数表示。

做法:如果(n,k)奇偶性不相同肯定不可以。如果(n<k*k)肯定不可以,因为(k)个互不相同的奇数可以表示的最小数是(k*k)。

(B)

题意:给定(n)个公主,每个公主都有自己心仪的王子,按照公主的编号从小到大,每次为她选择她心仪的编号最小的王子,问现在是不是最优匹配,如果不是应该在哪个公主的心仪王子中添加哪个王子。保证王子公主一一配对。

做法:每次读进来就为公主选好她的王子并标记,只要发现有一个公主没有选到王子就记住她的编号(最多就一个),最后扫描一下哪个王子没被选,输出他的编号和没选的公主编号就行了。也有可能不存在那就输出(OPTIMAL)。

(C)

题意:有(k)个点,每次操作可以把所有点整体向(Left(L),Right(R),Up(U),Down(D))移动一格,如果到了边还要移动就不能动了。问是否可以在(2nm)步内完成让每个点经过它的必经之点,如果可以则输出移动序列。(n,m,k leq 200)。

做法:发现(n,m,k leq 200),肯定可以(O(nmk))做。当然选择模拟,考虑先(U)后(D),然后在每一层处理先(L)后(R)和先(R)后(L)取(Min),然后再做一次先(D)后(U),每一层处理是相同的,和先(U)后(D)取(Min)。最后输出答案序列就行了。复杂度虽然是(O(nmk))的但是(n,m,k leq 200)所以能过。

(D)

题意:每个点有一个颜色(c_i)和其指向的点(p_i),求出最大的(k)满足(p^k)中的(color)都相等,而且必须是一个环上的一截。

做法:先把每个环都找出来,然后枚举环长的因子,然后(check)这个因子这一段的(color)是否都相等,如果满足则更新(ans),取(Min)即可。

(E)

题意:定义“块”表示连续相同数字的长度。给定(n),连续写下([0,10^n-1])这些数,不够(n)位的补足前导(0),求(forall i in [1,n])长度为(i)的块有多少个,对(998244353)取模。

做法:打表可知长度为(i)的块的数量为(10^{i-1} imes (81 imes (i-1) + 180),最后一个数量是(10),由于(n leq 2 imes 10^5 ),直接算即可。复杂度显然(O(n))。

(F)

题意:给定(3m)个数:(l_1,l_2,cdots l_m,r_1,r_2, cdots r_m, x_1,x_2 cdots x_m),已知长度为(n)的序列(a_1,a_2,cdots a_n)满足(a[l_i]& a[l_i+1] & cdots & a[r_i] = x_i),问合法的(a)序列数量(mod 998244353)。所有数( leq 2^k)。(n,m leq 5 imes 10^5 ,1 leq k leq 30)

做法:注意到(kleq 30),考虑枚举每一位来做。我们记录这一位必须为(1)的区间,可以枚举每个(x_i)用差分实现。然后记录必须为(0)的区间,令(pos[i])表示最大的(pos[i])满足(pos[i])~(i)这一段都为(0)。(dp)的时候考虑:如果(i)的(cnt geq 1),直接(f[i]=f[i-1])就可以了。如果(i)的(cnt==0),说明这个数的这一位不可以为(1),考虑(f[i-1])的(pos),若(pos[i-1]==0),说明它之前没有满足的(pos[i-1]),那么(f[i]=f[i-1]),直接沿用上一个数的方案数。但是若(pos[i-1] geq 0),说明前面有满足的(pos[i-1]),那就必须减去(f[pos[i-1]-1]),相当于(f(r)-f(l-1))这种思想,然后(f[i]+=f[i-1])。最后根据乘法原理把每一层的(f[n+1])乘起来就行了。

(G)

题意:定义(val_T = sum_{i=1}^k F(T,t_i) imes c_i),(F(T,t_i)=t_i)在(T)中出现的次数。现在给定(k)个(t_i)和(c_i)以及一个字符串(S),(S)中有一些(?),请用成对不同的(a)~(n)的字符填充这些(?)使得(S)的价值最大。求最大价值,若无法填充则输出(-1)。

做法:(AC)自动机(+)状压(dp)。先把原串的(AC)自动机建起来再补全(fail)指针。注意到字符集大小为(14),考虑状压。设(f[i][j])表示到(AC)自动机上的结点(i)选择的结点集合为(j)的价值,枚举下一个选择的进行转移。对于每一个(s[i]='?')的位置都做一遍上面的(dp),其余位置就更新价值。(ans=Max { f[i][k]+a[i] })。

原文地址:https://www.cnblogs.com/Kylin-xy/p/tijieCF1327.html