PKUWC2020 题意口胡

Day1

T1:
给出一个排列 P P ,令 f ( P ) f(P) 表示所有字典序比 P P 小的排列串成的串,问 f ( P ) f(P) 本质不同的子串个数, n 50 n \le 50


T2:
给出 n n 个集合,一开始每个集合只有一个数,每次随机合并两个集合,直到只剩下 k k
最后的答案 f ( k ) f(k) 是对这 k k 个集合的贡献求和,每个集合的贡献是 ( m a x ( S ) m i n ( S ) ) 2 (max(S)-min(S))^2 ,求 f ( l r ) f(l…r) 的期望

简要题解:
考虑钦定选一个集合 S,那么它的贡献就是 ( m a x ( S ) m i n ( S ) ) 2 (max(S)-min(S))^2 ,乘上存在集合 S S 的概率
显然只与集合的大小有关,于是需要求出 g ( i , k ) g(i,k) 表示 ,最后剩下 k k 个存在 S = i |S|=i 的概率
另外令 f ( i ) f(i) 表示所有大小为 i i 的集合的贡献和
先考虑 f ( i ) f(i) ,考虑钦定一个最大值和一个最小值
f ( i ) = l = 1 n r = l n ( a r a l ) 2 ( r l 1 i 2 ) f(i)=\sum_{l=1}^n\sum_{r=l}^n(a_r-a_l)^2*\binom{r-l-1}{i-2}
后面只与 r l 1 r-l-1 有关,于是转换为求出所有 r l 1 r-l-1 为某一个定值的所有 l , r l,r 的贡献
拆开就可以卷积实现
考虑求 g ( i , k ) g(i,k) ,令 D ( n ) D(n) 表示把 n n 个合并成一个的方案数,那么显然
D ( n ) = i = 2 n ( i 2 ) D(n)=\prod_{i=2}^n\binom{i}{2}
那么将 n n 个合并成 k k 个的方案数就是 D ( n ) / D ( k ) D(n)/D(k)
于是有
g ( i , k ) = D ( k ) D ( n ) ( n k i 1 ) D ( i ) D ( n i ) D ( k 1 ) g(i,k)=\frac{D(k)}{D(n)}*\binom{n-k}{i-1}*D(i)*\frac{D(n-i)}{D(k-1)}

意义是把 i i 个集合合并成一个,再把 n i n-i 个集合合并成 k 1 k-1 个,有序拼接,再除一个总方案数
A n s ( k ) = i = 1 n f ( i ) g ( i , k ) Ans(k)=\sum_{i=1}^nf(i)*g(i,k)
展开用 N T T NTT 优化即可
细节记不太清,希望大家指出错误
大概就是钦定集合,转成集合大小,枚举最大最小组合数算方案,然后算出概率,用卷积优化


T3:给一个矩阵,有 p 1 e 5 p\le 1e5 个操作来初始化,给定 s , l , r , x s,l,r,x 将所有与 s s 互质的行的 [ l , r ] [l,r] 加上 x x
q 5 e 4 q\le 5e4 个询问, s , l , r s,l,r 表示询问所有与 s s 互质的行的 [ l , r ] [l,r] 的和
n , m 5 e 4 n,m\le 5e4


Day2


T1:你有 n n 条鱼,每条为毒鱼或小鱼,敌方有圣盾鱼和大鱼
任意鱼和圣盾鱼对战后都会将圣盾鱼变成大鱼,只有毒鱼和大鱼对战能杀死大鱼,小鱼对战大鱼无影响
q q 次询问 ( k , x ) (k,x) 表示,在对方开始时已经有 x x 条大鱼的情况下,你用 1 k 1−k 的鱼依次与对方对战,假设有 y y 条圣盾鱼,最大化 y y 使得能全部打完
n , q 4 e 5 n,q≤4e5

好像方法很多,线性可以随便做,但还是说一下我的奇葩方法
如果当前是小鱼,那么破盾,如果是毒鱼,那么就杀死大鱼将 ans++
如果没有大鱼,那么毒鱼用来破盾
考虑离线下来做一个前缀,维护每一个 x x 的答案
动态维护剩下多少大鱼,相当于动态维护一个数组,如果是毒鱼就是将为 0 的地方变成 1,将不为 0 的地方减 1 并将答案加 1,否则全部加 1
维护每一个权值的集合,发现只有合并,带权并查集维护


T2:给定 { a 0 , a 1 , . . . , a n } , { p 0 , p 1 , . . . , p n } \{a_0,a_1,...,a_n\},\{p_0,p_1,...,p_n\} ,p 表示分式的横线长度也就是分式运算的优先级,问 p l . . . p r p_l...p_r 组成的分式的值, n , q 5 e 5 n,q\le 5e5

考场打的单调栈,但是有 35 没写怪可惜的
考虑一个数的贡献是本身还是逆元,发现跟单调栈的奇偶性有关,于是可以离线下来,维护每一个 l l 的答案,考虑 r r 的贡献就可以做,就是将据 r r 有奇数段的全部乘逆元,有偶数段的乘本身
这样复杂度是O(段数),只能过随机数据,但类似刚刚的带权并查集对奇数段和偶数段分别维护就可以了

还有一种方法就是建出一个类似线段树的东西查询,同样随便过随机数据,考虑求出一个结点以 m i d mid 为分界点的前缀和后缀的答案,这样一个区间只会在第一个被切开的地方求出答案
考虑一个后缀吧,是由右儿子的后缀和右儿子的全部以及左儿子的后缀组成,后面这个玩意就是将左儿子的后缀全部除一个数,线段树合并即可

还可以对建出的树用广义线段树处理,以后再学(FLAG)


T3:有一个大环顺次连接 ( i , i + 1 ) (i,i+1) 边权为 1 e 9 1e9 ,令给出 m 1 e 5 m\le 1e5 条边,边权为 w i 1 e 4 w_i\le 1e4 ,求任意两个点的最小割之和, n 7 e 3 n\le 7e3

显然只会段两条边,枚举两条边,那么最小割就是两条边的权值加上穿过中间的权值,预处理二维前缀和就可以 O ( 1 ) O(1) 得到,考虑哪些点对可以以这个最小割为答案,同样是一个矩阵
于是就是矩阵覆盖单点 m i n min 可以 O ( n 2 l o g ( n ) 2 ) O(n^2log(n)^2)
正解好像是用最小割树,只求 O ( n ) O(n) 次最小割,只要每次做到 O ( n ) O(n) 就可以了,但还不是很会(FLAG)

发布了610 篇原创文章 · 获赞 94 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/sslz_fsy/article/details/103678110