CF1146 Forethought Future Cup Elimination Round Tutorial

CF1146 Forethought Future Cup Elimination Round Tutorial


叮,守夜冠军卡

https://codeforces.com/blog/entry/66639

B

有一个串(s),生成了一个新串(t=s+s')(s')(s)去掉所有'a'之后的串,给出(t),求(s)

如果只看不是'a'的数量也只有最多一个位置满足条件,直接判一下这个位置即可。

https://codeforces.com/contest/1146/submission/53060920

C

有一棵n个点的树((nleq 100)),你可以进行不超过9次询问,每一次询问你给出两个非空且不交的集合(x,y),返回(max_{ain x,bin y}dist(a,b))。求树的直径

考虑(query(S)=max_{a,bin S}dist(a,b)),答案就是(query({1,2,...,n}))

(query(S))可以先将(S)分成两个集合(A,B),询问(A,B),再分别处理(query(A))(query(B))(query(S))就是这些的最大值。如果A,B尽量平均分配,那么只需要(log n)次就可以将(S)分的只剩一个点。但是这样好像还是(O(n))的,然后又发现可以分别处理(query(A))(query(B))的时候,将(A)分成(A_1,A_2)(B)分成(B_1,B_2),那么询问可以合在一起询问。每一层都合在一起询问就只需要(log n)了(所以(n)还能出大一点?)

https://codeforces.com/contest/1146/submission/53065055

D

长者在数轴的(0)位置。长者有两个正整数(a,b),如果当前长者在位置(k),长者可以用simple的力量将自己传送到(k+a)或者(k-b)位置。

但是长者感觉这样很无聊所以打算将自己限制在一段区间里。(f(x))表示长者只能在([0,x])区间里移动,从(0)开始能到达的整点数量。长者想求(sum_{i=0}^mf(i))

(mleq 10^9,a,bleq 10^5)

比赛不知道抽啥风想不出来。。。。可能是守夜自带debuff??

写了个比较好理解的做法

显然法证明(x)较大(具体是(xgeq a+b))时(f(x+a)=f(x)+frac{a}{gcd(a,b)})

(p_i)表示最小的(r)使得(0)只经过([0,r])能到达(i)(如果永远不能则为(infty)

可以用一个最短路求出(p_i)

那么(sum_{ileq x}f(i)=sum_{j=0}^imax(0,x-p_j+1))

这样可以(O(a+b))直接计算出前面的一段(f)(看代码)

(geq a+b)的部分,可以用上面的式子算

对每一个(imod a)(f)就是一段等差数列,直接套公式算即可。

注意最短路算(f)要算到(2a+b)

https://codeforces.com/contest/1146/submission/53115782

E

有一个数列,每次操作给定x和不等号,将(>x)(<x)的所有数乘-1,求最后数列。所有数的绝对值(leq 100000)

显然只要对每个数算最后情况就行了。好像不是很好算,发现对于每个数(x>0)(x)(-x)最后只会有4中情况:都不变,都变成相反数,都变成(-x),都变成(x)

只要用线段树维护这个东西,分类讨论一下就好了。

线段树维护两个标记:区间赋值(都变成(-x),都变成(x)),区间取反(都不变,都变成相反数),计算答案时如果有区间赋值标记则优先,否则用区间取反标记。

https://codeforces.com/contest/1146/submission/53072116

F

有一个(1)为根的有根树,设(L)是一个叶子节点的集合,(f(L))就是这些集合的最小联通子图。

你要给叶子分成若干个集合,使得任意(f(x))(f(y))(x,y)都是你分出来的集合),(f(x)cap f(y)=emptyset)。求方案数。

定义(x,y)相连表示,最终存在一个(f(L))使得(x,yin f(L))

(f[x][0])表示(x)最终不与父亲相连的方案数,(f[x][1])表示(x)最终与父亲相连的方案数。

然后还要将(x)与一些儿子合并。

如果合并了(0)个儿子,那么(x)最终不在任何一个集合,当然不能和父亲相连;

如果合并了(1)个儿子,那么一定在其他子树还有相同集合的,也就是必须和父亲相连;

如果合并了(geq 2)个儿子,可以任意决定是否与父亲相连。

直接dp就好了。

https://codeforces.com/contest/1146/submission/53121149

G

竟然又是一道sb套路一眼秒的网络流,给出题人好评!

某沙雕要修(n)栋房子,每栋房子高度可以是(0)(h),如果高度是(a)获得(a^2)的收益。还有(m)个限制,如果(l)(r)有任意一栋房子高度大于(x)则要付出(c)的代价。

所有数(in [0,50])

显然裸的最小割,会做切糕的都会这个题。还有一道差不多的:cf434d

https://codeforces.com/contest/1146/submission/53073780

H

平面上有(n)个点,求构成的五角星数量。任意三点不共线。

五角星可以不是正五角星,只要对应的交叉点存在就可以计算。

这题应该不会改(鱼的恐惧)

upd:改了改了,真香

这题比鱼不知水到哪里去了

五角星可以转化成5个点的凸包,就是5条极角序线段上升的线段。

(f[i][j][k])表示从(i)开始到(j)的一个线段路径共有(k+1)条边,那么每次按照极角序新加进来一个线段(x ightarrow y),转移是(f[x][y][0]=1,f[S][y][k]+=f[S][x][k-1])

https://codeforces.com/contest/1146/submission/53116991

原文地址:https://www.cnblogs.com/xzz_233/p/10744690.html