挑一些没做出来的讲讲
D1T2
题意:(n)点(m)条边的图,给边定向,使得存在点使得(1)和(2)能走到该点
(nle 15,mle {nchoose 2})
求不存在点使得(1)和(2)同时走到该点
枚举集合(A,B),表示(1)能到达的集合,(2)能到达的集合
- (Acap B=emptyset)
- 不存在边((u,v)),(uin A,vin B)
- ((u,v)in E,u otin A,v otin B),该边怎么定向都无所谓
- ((u,v)in E,uin A,v otin B),该边方向确定
然后单独处理(A,B)内的,令(f_{1/2,S})为(1)到达点集为(S)的方案数
(O(3^n))
D1T3
题意:给定长度为(n)的字符串,找到最大的(m),使得存在(1le l_1le r_1le l_2le r_2le cdotsle l_mle r_m),(s_{l_{i+1},r_{i+1}})是(s_{l_i,r_i})的严格子串
结论1:存在最优解,使得子串长度每次减小(1)
令(f_{i})为以(i)开头的子串作为第一个,最大的(m)
结论2:(f_{i}le f_{i+1}+1)
证明:
相当于证明(f_{i+1}le f_{i}-1),这很显然
那么每次判断初始化(f_i)为(f_{i+1}+1),然后一步步判断
考虑如何判断(f_i)大于等于(len)
- (jin[i+len,n])
- (max(lcp(suf_i,suf_j),lcp(suf_{i+1},suf_j))ge len-1)
- (f_jge len-1)
条件2的(j)分为可以二分出来,然后就是(jin[i+len,n],rank_jin[l,r]),是否存在(f_jge len-1),可以用线段树维护
D2T1
题意:有一个长度为 (n) 的数列,原先每一个位置都是 (0)。每一次,我们可以给两个相邻的位置分别 加一 和 加二 。问最少需要操作多少次,才可以使得对于 (1≤i≤n),第 (i) 个位置上的数大于等于 (h_i)
看不懂题解...
D3T2
这题很有意思啊
题意:给定(n) 个点 (m) 条边的无向图,求有多少个非空点集的导出子图连通。
((x,y)in E) 满足 (|x−y|≤12)。
答案对 (2) 取模,(1≤n≤50)
考虑对连通块黑白染色,那么对于一个子图,染色的方案数为(2^{连通块个数}),该为对(4)取模,若最后答案为(2)则为(1),否则为(0)
状压点的颜色。(O(3^{12}n))
D4T3
题意:给定一棵 (n) 个点的有边权的树,(q) 次修改某一条边的边权,要回答在初始局面和每次修改后,有多少条无向路径 ((u,v)) 满足路径上所有边的 gcd 恰为 (1)
(nle 10^{5},qle 100,w,xle 10^6)
先考虑(q=0)
令(f(i))为路径为(i)倍数的个数,(ans=sum mu(i)f(i))
由于(wle 10^6),(w)最多质因子个数为(7),每条边的有效约数为(2^kle 128),用并查集做(O(2^k nalpha(n)))
考虑(qge 1),对于((u,v,w)in E),考虑撤销((u,v,w))的效果,再添加((u,v,w'))的效果
处理(u)、(v)的子树,令(g(i))为(i)到(u/v)边权的gcd,(O(nlogw))。再合并,(O(sqrt{w}cdot sqrt{w}))
(O(2^k nalpha(n)+qcdot (nlogw+sigma(w)_0cdot sigma(w)_0)))
D5T1
给定一个长度为 (n) 的序列 (a_1,a_2,⋯,a_n) ,(a_i)为在 ([l_i,r_i]) 中独立均匀随机生成的实数,求这个序列逆序对个数的期望值
D5T3
给定一个 (1) 到 (n) 的排列,你需要把它升序排序。你要进行两个阶段的操作。第一阶段中,每次任选两个相邻元素并进行交换。第二阶段中,每次修改一个位置上的元素。最小化两个阶段操作的总次数,并给出一种总操作次数最小的合法方案。
在第一阶段中,若进行过(i,i+1)交换,则(i)与(i+1)之间连边
对于极大连通块([l,r]),令其逆序对个数为(x)
若(xge r-l+1),则可以通过第二阶段直接搞,故在最优中不会出现
因为对于一个连通块([l,r]),其至少有(r-l)条边,故(xge r-l)。
所以所有的极大联通块,其逆序对个数为(r-l)
故对于区间([l,r]),其可能成为极大连通块的条件为
- ([l,r])是(a_l,cdots,a_r)的值域
- (a_l,cdots ,a_r)的逆序对个数为(r-l)
若([l_1,r][l_2,r](l_1<l_2))均满足条件,则选择([l_2,r])不会劣于([l_1,r])。故我们会选择以(r)为右端点的最大合法(l)
根据对极大连通块的定义,最大的合法(l)只需要考虑最大满足条件(1)的
考虑第一个条件的充要条件
- (max(a_l,cdots,a_r)=r)
- (sumlimits_{i=l}^r (a_i-i)=0):前缀和相等
考虑如何快速求([l,r])的逆序对,由于(a_l,cdots,a_r)的值域是([l,r]),(a_1,cdots,a_{l-1})中的任意数,要么全部大于([l,r]),要么全部小于
令(sum_i)为(a_1,cdots,a_i)的逆序对个数,(f(l,r)=sum_r-sum_{l-1}-(r-l+1)sumlimits_{i=1}^{l-1}[a_i>l])
然后随便搞个dp