[LOJ6029~6052]雅礼集训 2017 选做

Link

代码可以在loj上看我的提交记录。

Day 1

[LOJ6029]市场

对于一次除法操作,若区间内所有数的减少量均相同则可视作区间减法,否则暴力递归下去。显然一个线段树节点只会被暴力递归进去(log( ext{Max-Min}))次。对每个点定义势能函数,每次暴力递归都会减小势能,而修改操作只会使(log n)个节点恢复原势能,所以复杂度(O((n+mlog n)log a))

[LOJ6030]矩阵

显然需要构造出一行全黑,然后用这行全黑去覆盖剩下所有非全黑行即可。

考虑把第(i)行构造成全黑。只需要第(i)列上有黑色就可以一个一个地全部覆盖成黑色,否则若第(i)行原本至少存在黑色则可以先用一次操作让第(i)列有黑色。

可以发现无解当且仅当不存在黑色。

[LOJ6031]字符串

首先观察到(qkle10^5)

如果(k)较小,则可以(k^2)地计算(w)的每个子串在(s)中的出现次数,再算一下对(w)的所有询问中每个子串分别被问了多少次,复杂度(O(qk^2))

如果(k)较大,那么可以对所有串建广义( ext{SAM}),然后暴力枚举每次询问,倍增定位出当前询问区间对应子串的后缀自动机节点,复杂度(O(qmlog n))

将上述两者结合即可。

Day 2

[LOJ6032]水箱

根据隔板高度可以建出一个(2n-1)个点的树形结构,可以将每个要求倍增定位到树上节点,然后就是一个简单树(dp),记(f_{i,0/1})表示(i)号点是否被水淹没时最多可满足的要求数目,在每个点内按要求的高度排序,贡献是前缀(1)的数量加上后缀(0)的数量。

[LOJ6033]棋盘游戏

经典的二分图博弈模型。对所有空格做二分图匹配,若某个点一定在最大匹配中则从该点出发先手必胜,否则后手必胜。由于点数较多所以需要用网络流实现二分图匹配。

[LOJ6034]线段游戏

李超线段树模板题。

Day 4

[LOJ6035]洗衣服

求出(f_i,g_i)分别表示洗干净/烘干前(i)件衣服的最短时间,那么答案就是(min_{i=1}^n{f_i+g_{n-i+1}})

[LOJ6036]编码

对每个串设(0/1)变量表示问号处填什么,把所有串(含问号的串填上(0/1)后分别)插入( ext{Trie})树,向路径上的点连边。需要注意的是( ext{Trie})树上同一个节点内最多只能有一个取值为真,可以使用类似UOJ210寻找罪犯的方法优化建边。

Day 5

[LOJ6038]远行

两棵树合并以后新树直径的两端点一定是原来两棵树直径四个端点中的两个。所以直接( ext{LCT})维护连通块内直径即可。

[LOJ6039]珠宝

(f_{i,j})表示考虑完售价小于等于(i)的珠宝,花费(j)能够获得的最大收益。对于售价相同的所有珠宝肯定是优先选价值收益最大的,所以转移函数是凸的,那么就决策单调性搞搞,复杂度(O(mklog m))

[LOJ6040]矩阵

首先求出矩阵(C)的秩(r),对于所有秩为(r)的矩阵它们的答案都是一样的,所以就只需要求出“有多少对矩阵((A,B))相乘得到的矩阵(C)的秩为(r)”后把答案除以秩为(r)的矩阵个数就行了。

(f_{i,j})表示一个(i imes n)的矩阵其秩为(j)的方案数。这个(dp)可以在(O(n^2))的时间内完成。

然后考虑设(A)的秩为(x),那么能够组成的(C)就有(f_{x,r})种,而组成同一种(C)(B)均有(2^{n(n-x)})种,因此答案为(sum_{i=r}^nf_{n,i}f_{i,r}2^{n(n-x)}),最后再除个(f_{n,r})

Day 7

[LOJ6041]事情的相似度

( ext{YCB})冬令营模拟搬的题目,要是再晚两天考的话应该就做到了吧。

考场上写的是( ext{SAM+LCT})然后离线询问按右端点挂链,( ext{BIT})维护后缀最小值。具体来说就是两前缀的( ext{lcs})就是它们在前缀树(正串建( ext{SAM})构出的( ext{parent})树)上的( ext{lca})( ext{len})值,所以相当于是要求区间内任两点的( ext{lca})( ext{len})的最大值。从左往右枚举右端点,每次相当于做一个( ext{access})操作,用( ext{LCT})实现。

把树状数组换成可持久化线段树可以做在线。貌似还有一种( ext{SAM+dsu})的做法。

[LOJ6042]跳蚤王国的宰相

(S=lfloorfrac n2 floor)

一个点要作为重心,就要求它的每个子树大小不超过(S)。显然只有原重心所在的子树会不满足这一条件,所以考虑把这一部分的大小砍到(S)以下。

显然只会割原重心的相邻边,贪心优先割大的。同时有一个结论是所有点除原重心外答案相差不超过(1)

[LOJ6043]蛐蛐国的修墙方案

考虑(i)(p_i)连边,这样的图一定是由若干个环构成,且每个点的度数为(2)。因此为了有解,每个环的大小都应为偶数,且选取方案有且仅有两种(考虑一条边选或不选,其余的边随之确定)。

这样就可以做到(O(2^{frac n2}n))的搜索复杂度。考虑到当环大小为(2)时,在左边放左括号一定不会更劣,所以就只需要考虑所有大小大于等于(4)的环即可,复杂度(O(2^{frac n4}n))

Day 8

[LOJ6044]共

实际上就是左侧(k)个点右侧(n-k)个点的完全二分图生成树计数。给点标号还需要乘上一个(inom {n-1}{k-1})

完全二分图生成树计数可以用矩阵树定理列出基尔霍夫矩阵后手解行列式,算出来结果是((n-k)^{k-1}k^{n-k-1})

[LOJ6045]价

先求出任意一组完美匹配,为了使左右两边选的点数相同,如果左边的(i)点选了,其一条出边指向右边的(j)点,那么(mat_j)这个左边的点也一定要被选。

(x)选了(y)就一定要被选”,这是最大权闭合子图的经典模型。最小割即可。

[LOJ6046]爷

( ext{dfs})序转区间。分块暴力,定期重构。

建块的时候保证块内极差不超过(10T),且块的长度不超过(T),块内以值域为下标维护前缀和。

查询就先二分答案再查区间内有多少个数(le k)

Day 10

[LOJ6047]决斗

找一个位置(x)使得没有人会从(x-1)走到(x)。可以令每个位置上的值为(A_i)指向这一位置的精灵数量(-1),然后前缀和一下最小值出现的位置就是(x-1),其后面一个位置就是(x)

然后就从(x)出发走,用一个( ext{std::set})维护当前可自由选择的精灵集合,类似田忌赛马那样操作即可。

[LOJ6048]数列

因为求的是严格上升,所以可以把数列反过来再在前面写一遍,然后直接求最长上升子序列就是第一问的答案。

第二问,对最长上升子序列记个数,再乘上(2^{n-maxlen-1})即可。

Day 11

[LOJ6052]DIV

复数的条件是(ac-bd=n,ad+bc=0)

(a=px,b=qx,c=py,d=-qy(x,y,pin N^+,qin N,(x,y)=1,(p,q)=1)),那么就有(n=xy(p^2+q^2))

我们要求的是(sum_{xy(p^2+q^2)=n,(p,q)=1}px)。实际上还要当(q eq0)时要乘(2),因为这里只枚举了(b>0)的复数,而(b<0)的显然是对称的。

考虑转化一下(sum_{(p^2+q^2)|n,(p,q)=1}psum_{x|frac{n}{p^2+q^2}}x=sum_{(p^2+q^2)|n,(p,q)=1}p imessigma(frac n{p^2+q^2}))

(1)(nsum)起来答案是

[sum_{i=1}^nsum_{(p^2+q^2)|i,(p,q)=1}p imes sigma(frac i{p^2+q^2})\=sum_{i=1}^nsigma(i)sum_{p^2+q^2lelfloorfrac ni floor,(p,q)=1}p ]

然后把((p,q)=1)这个限制反演掉就是

[sum_{d=1}^{sqrt n}dmu(d)F(frac {n}{d^2}) ]

[F(n)=sum_{i=1}^nsigma(i)sum_{p^2+q^2lelfloorfrac ni floor}p ]

对于所有要计算的东西,预处理其前(n^{frac 23})项,剩下的暴力并记忆化,复杂度就对了吧。

原文地址:https://www.cnblogs.com/zhoushuyu/p/10169178.html