2023.12 杂题

I found it hard, it's hard to find. Oh well whatever nevermind.

1. CF1904E Tree Queries

Tag:T-欧拉序;S-线段树。
注意到 kn 同级,大抵是一个和 k 相关的做法,虚树大概是不可行的,所以考虑一些别的东西。
使用欧拉序描述整棵树,那么这个时候 x 所在的连通块可以划分成若干个欧拉序上面的区间,这个区间量级是 O(k) 的。
处理答案只需要离线询问后每次换根即可,这里的维护是容易的,CodeO(nlogn)

2. CF1904F Beautiful Tree

Tag:G-优化建图;G-拓扑排序;H-倍增。
怎么感觉是简单题。
考虑 O(n2) 怎么做,显然嗯建个图出来跑拓扑排序就秒杀了。
所以要做到 O(nlogn) 上我们的倍增优化建图就完事了哈哈,实在是有点难绷。
其实写起来有点像 ST 表优化建图?不管了反正就板子优化建图,Code

3. ABC332G Not Too Many Balls

Tag:G-网络流;D-背包。
hot tea!显然有网络流建模:

  • 建立二分图,左侧 n 个点,右侧 m 个点,以及源点 S 汇点 T
  • i 为第 i 个左部点,连边 (S,i,Ai),令 j 为第 j 个右部点,连边 (j,T,Bj)
  • 连边 (i,j,ij)
    直接求最大流肯定过不去,考虑有什么好的优化,直接在最大流角度有点 hard,考虑转最小割。
    令左侧点集为 P,右侧点集为 Q,左侧和 S 连一起的点集为 X,右侧和 S 连一起的点集为 Y
    那么最小割即:

minXPminYQ(iPXAi+jYBj+iXijQYj)

直接做仍然很难做,考虑枚举 iXi,则答案变为(令 L=iXi):

minL=0N(N+1)/2minXP,iXi=LminYQ(iPXAi+jYBj+LjQYj)=minL=0N(N+1)/2(minXP,iXi=LiPXAi+jQmin(Bj,jL))

这个时候前后就拆成了两部分,第一部分可以背包解决,第二部分可以求出每个 j 在何时切换,然后扫一遍完事,总时间复杂度 O(N3+M)Code

4. SCOI2016 萌萌哒

Tag:S-ST 表;S-并查集。
没见过这种套路啊!注意到条件可以类似 ST 表拆成两个大小为 2k 的条件,于是拆开。
然后最后再从大往小处理限制,就可以做到 O(nlogn)Code

5. ICPC 2023 Shenyang M Outro: True Love Waits

Tag:H-Ad-hoc。
不错的思维题。
首先 s 走到 t 可以看成 0 走到 st,随便打个表观察规律可以得到转移是呈现一个 (00)(01)(11)(10)(00) 的形式,进一步扩展可以发现下两位也是这样的一个循环,且这个循环内套了 4 个上述这般的循环,最后又回到 0
那么可以观察出来 0 被第 k 次经过满足的步数恰好是 i=1k14i,结合这个就可以做掉 00 的情况。
其余情况下,将 st 看成四进制,则这个数能被走到的次数与其后缀 0 的个数相关,且每次循环所需的步数和上述步数是类似的,所以只需要求第一次经过的步数,这个按位枚举一下就行,复杂度 O(L+logp)Code

6. B Turning Permutation

Tag:D-计数 DP。
插入类计数 DP。考虑试填。
每次尝试固定 pi=x,则此时有一个前缀被 fix 住,接下来求出剩下的方案即可。
fi,j,0/1 表示现在只考虑 [1,i] 的排列,并钦定 i 当前在 j 上,且我们钦定 q2 是谷还是峰,因为相对大小不会变化,所以这样做是合理的。
接下来要考虑固定住的数,首先在填到这个数的时候,肯定会钦定这个数填在哪里,其次其他的数不能填在这些数之前,没了。
总时间复杂度 O(n5),不知道这个二维 DP 可以用什么 Poly 啥的搞一下的,不懂,Code

7. H Line Graph Sequence

Tag:H-Ad-hoc。
其实感觉场上有可能能做出来,严谨的做出比较困难?先胡个做法:直接暴力模拟几次,如果中途爆了 105 或者和上次的点数边数完全一样,就直接退出,取中途最小值即可。
手摸了五个点的菊花图,发现确实如此,这个增长率是非常大的。
注意到四个点的菊花图会收敛到三元环不动,一条链会消没,一个环会不动,如果判定收敛就把每个连通块对应的连通块情况判掉即可,Code

8. D. Dark LaTeX vs. Light LaTeX

Tag:D。
A,B 拼接之后合法,当且仅当 A=aba,B=b,交换 S,T 再做一遍即可。
首先两边相等的情况可以使用 LCP 统计,答案即为 ijLCP(S[i...n],T[j...n]),可以 DP 预处理出 fi,j 表示 LCP(S[i...n],T[j...n]) 然后就可以统计。
接下来考虑上述情况,枚举 A 中两个 a 的左端点 i,j,则 a 最长是 LCP(S[i...n],S[j...n])b 最长是 maxkLCS(S[1...j1],T[1...k]),令这两是 x,y,则答案应当是 a=1xk[yjia],可以前缀和统计,O(n2)Code
常规的 SAM,SA 之类的似乎都做不了(反正我不会),最后却是最基本的 DP,套路见多了脑子不转了属于是。

9. I. Three Rectangles

Tag:H-分类讨论。
枚举左上角塞哪个矩形,接下来看哪个角没有填好,没填好就塞一个矩形,如果铺满了剩下的就有若干种方案填好。
这肯定会算重,但是减掉算重的其实应该不难,需要几次容斥?
看眼题解,好像做法是一样的,但是估计有点难写,鸽了。

10. A. Intro: Dawn of a New Era

Tag:G-网络流。
如果说将能产生贡献的点连边,则这会连出一个 DAG,问题即求 DAG 最长反链覆盖,但是这个图是建不出来的,然后就不懂了。
考虑对颜色建点,那么先让所有的颜色都对最大颜色连边,那么问题等价于我们要求一组路径,使得所有最大颜色都至少被访问过一次,且每个集合只经过一次,使得路径数量最小。
为了限制住这些条件,考虑对颜色拆点,限制那些最大颜色被访问过至少一次,那就是入点和出点流量至少为 1,再新建若干个点来限制集合的流量最多为 1,这样就可以求一个最小可行流就是答案。
考虑怎么样构造答案,每一个满流的增广路中相邻的两个表示集合的点必然意味着他们在方案中也是相邻的,使用一次 DFS 就可以抽出这些路径,注意到 maxS 相同的可以被放到一起,记得同时放上这些路径,代码鸽了。

11. F. Ursa Minor

Tag:S-分块,S-ST 表,S-根号分治,M,H-哈希。
首先提取一下判定条件,注意到我们操作的最小单位是 d=gcd(b[s,t],rl+1),说明我们一次可以操作 d 个数,那么实际上就可以将整个序列按下表与 d 同余分成若干份,目标即使 check 每一组内总和是否相等,因为每一次操作等于给每一组加上一个值。
考虑如何 check,首先这个 d 可以 ST 表维护 GCD 一波带走,而这个总和,令他为 s0,也可以使用对 d 根号分治的手段处理掉(>n 直接求和,nO(nn) 数组预处理下来),于是只需要考虑剩下的总和是否相等。
直接做挺难的,尝试哈希,取 xp,计算哈希值 i=lraiximodd,那么总和相等等价于上面这玩意等于 s0i=0d1xi,接下来就求上面这玩意就行了。
同样地尝试根号分治:

  • dn,仅有 n 个不同的 d,同样开 n 个数组,单点修改直接改,查询的时候 O(n) 查询复杂度就是对的。
  • d>nximodd=xixi/dd,注意到此时的 i/dd 仅有 n 个,维护 aixi 的总和,那么问题变成 O(qn) 次查询区间和,O(q) 次修改,分块维护前缀和即可变为后缀加单点查,复杂度也对了。
    总复杂度 O(nn),是一道不可多得的分块练习题,不过我写代码的时候写错好几回,只能说我贼傻逼,Code

12. CodeChef COLORTREE Subtree Coloring

Tag:D-树形 DP。
fu,k 表示 u 子树内两种颜色差为 k 的答案,答案即为 f1,0+f1,1+f1,1
几个观察:fu,1=fu,1,若 sizu 为偶数则 fu,1=0,否则 fu,0=0
这样子才可能进行转移,考虑转移:

  • 若讨论 fu,0sizv 为偶数的子树肯定是直接累乘上来,为奇数的子树,记其有 m 个,则答案为 (mm/2)fv,1,理由是两者恰好相消,注意这里在计算的时候要算上 u 的取色方案。
  • 若讨论 fu,1sizv 为偶数的子树还是只能累乘上来,为奇数的子树,同样记其有 m 个,答案与上面类似罢了。
    复杂度 O(n)Code

13. JOI 2019 Final Unique Cities

Tag:D-树形 DP;T-直径。
好题,首先对于 x 而言,答案一定在以 x 为端点的最长链内。
找出树的直径 s,t,以其任意一个端点出发 DFS,则答案一定在某一次 DFS 中出现。
预处理出以 s,t 为根的最长链长度和次长链长度,再次 DFS,尝试维护当前点 u 到根的好点集,首先先将父亲节点加入点集,然后:

  • 将次长链可以踢出的点踢出点集。
  • 递归最长链。
  • 将最长链可以踢出的点踢出点集。
  • 统计答案。
  • 递归其余儿子。
  • 回溯,将父亲节点踢出点集。
    上述的做法可以保证在 O(n) 的复杂度内求出好点集,再使用桶就可以解决整个问题,Code

14. PTZ21W Day 9 K. Knowledge Is...

Tag:M-贪心。
直接暴力建图是不可能的,考虑贪心,维护当前已经被匹配的区间对和未被匹配的区间。
注意到我们希望未被匹配的区间右端点在合法情况下肯定越小越好,那么需要实现反悔操作,具体的,我们先按左端点从小到大的顺序排序,然后对于每一个区间,首先先看可不可以和可以匹配的匹配上,如果不行尝试反悔,反悔出一个更小的待匹配的丢到待匹配堆里,这样只需要实现两个堆就行了。
总时间复杂度 O(nlogn),好题,Code

15. JOISC 2018 Day 1 Construction of Highway

Tag:T-重链剖分。
不算难的题,使用类似珂朵莉树的结构直接维护每条重链的连续段,询问答案的时候直接将所有连续段扣下来跑树状数组即可。
猜测(?)连续段的段数是 O(logn) 的,直接跑就是 O(nlog2n) 的,听说有 LCT 做法?
Code

16. JOISC 2018 Day 1 Tents

Tag:D-计数 DP。
fi,j 表示现在已经决策好了 ij 列,且当前最后一次决策决策的是第 i 行,则考虑符合条件的帐篷形态:

  • 占据一行一列:4jfi1,j1fi,j,此时帐篷有 4 个方向,并且选择剩下的一列有 j 种方案。
  • 占据一行两列:(j2)fi1,j2fi,j,选两个列出来。
  • 占据两行一列:(i1)jfi2,j1fi,j,从前 i1 个取一个出来与 i 凑成一列。
    最后的答案是 ijfi,j(ni)(mj)O(n2)Code

17. JOISC 2018 Day 2 Asceticism

Tag:M-欧拉数;M-组合数。
如果记得一些特殊数列就会发现问题等价于求 nm1
《具体数学》 6.38 告诉我们:

nm=i=0m(n+1i)(m+1i)n(1)i

下证这个式子:尝试归纳,首先有:

nm=(m+1)n1m+(nm)n1m1

证明考虑新插入一个数对连续段的影响。
假设通项对 n1mn1m1 均成立,则有:

nm=(m+1)i=0m(ni)(m+1i)n1(1)i+(nm)i=0m1(ni)(mi)n1(1)i=(m+1)i=0m(ni)(m+1i)n1(1)i(nm)i=0m(ni1)(mi+1)n1(1)i=i=0m(m+1i)n1(1)i((ni)(m+1)(ni1)(nm))

     (ni)(m+1)(ni1)(nm)=(ni)(m+1i)+(ni)i(ni1)(nm)=(ni)(m+1i)+(ni1)(ni+1)(ni1)(nm)=(ni)(m+1i)+(ni1)(mi+1)=(n+1i)(m+1i)

由此,原命题得证,O(nlogp)Code

18. JOISC 2018 Day 2 Worst Reporter 3

Tag:H-模拟。
观察到性质:每个点走的步长一定是前面的若干倍。
则可以预处理出每个人的步长,观察到步长相同的人可以被压到一起移动,这样本质不同的步长就只剩下 O(logV) 个,于是直接暴力枚举求交即可,Code

19. JOISC 2018 Day 3 Airline Route Map

Tag:H-构造。
如果将 G 作为导出子图传过去,那么关键就是确定点的编号。
考虑到 log21000=10,开 10 个点 u0,,u9,对于 ui,让他向所有二进制下第 i 位为 1 的点连边。
接下来就考虑如何确定这 10 个点,我们还有两个点,那首先需要有一个点能够被确定,然后来确定另一个点,而后确定这 10 个点,最后确定 G 这个导出子图。
构造 u10 连向其他除了 u11 以外的所有点,则 u10 的点度一定最大,同时排除掉 u10 的邻域就可以求出 u11
u11 指向所有 u0u9,就可以确定 u0u9 是哪些,但是并不能知道具体谁是 ui,考虑建一条链 u0u1u9,但是链是无向的,所以需要确定链头 u1,但是 degu0>degu9 是一定满足的,于是搞定了。
这样就能做到 N+12 了,很牛逼的题,感觉我想了一半左右就不会了,哈哈,Code

20. JOISC 2018 Day 3 Bitaro's Party

Tag:S-根号分治。
感觉很有提示性,因为是 DAG,你是整不了什么花活的,大概率根号分治。
那就直接根号分治:

  • |S|<N,对每个点预先处理出前 N 大的路径,这可以拓扑排序+归并实现,询问的时候直接扫一遍就可以了。
  • |S|N,这种询问不超过 N 次,所以直接建反图暴力拓扑排序就行了。
    复杂度 O(NN)Code

21. JOISC 2018 Day 4 Library

Tag:H-二分。
首先,可以询问 U{x} 来确定 x 是否在某一端,如果其在那么会返回 1
接下来从这一端出发来确定下一位,考虑目前的可能在这一位的集合 S,直接二分,取一个大小为一半的子集 T,询问 TT{ai1} 就可以确定 ai 在不在 T 里面。
这样就可以做到约 2nlogn,但是实际上跑不满,Code

22. JOISC 2018 Day 4 Candies

Tag:H-贪心;S-链表。
考虑贪心,但是会发现有可能出现第一次选了某个点 x,第二次选了 x1,x+1 的情况,所以需要反悔,发现返回都类似于 0101010 反转成 1010101 的形式,尝试维护。
使用链表维护上述连续段,每次反悔的时候只需要将当前决策改为 apre+anxtax 插回 set 里即可,注意若这个连续段有一段顶到首尾则不能考虑他的决策,因为此时反转不会使得取出的个数加一,O(nlogn)Code

23. JOISC 2018 Day 4 Wild Boar

Tag:G-最短路;S-线段树;D-动态 DP。
如果没有不能回头的限制,则答案显然是相邻的最短路之和,考虑加上这个限制之后会发生什么。
自然想到维护次短路,然而这并无法处理只需要一边不走对应边限制的情况,于是尝试预处理出如下四种路径:

  • 最短路,令其起始边 s1,终止边 t1
  • 次短路,令其起始边 s2,终止边 t2,要求 s2s1t2t1
  • 次短路,令其起始边 s3,终止边 t3,要求 s3s1t3t2
  • 次短路,令其起始边 s4,终止边 t4,要求 s4s2t4t1
    可以证明答案一定由这四种路径拼接而成,相邻的两段路径是否可以转移是可以手动枚举出来的,于是可以写成 DDP 的形式,使用线段树维护矩阵即可。
    考虑预处理,这里很妙:把无向边拆成两个有向边,从边出发跑 dijskra,每次松弛 (u,v) 的时候优先松弛除了 (v,u) 以外的所有边,第二次到 v 的时候再松弛 (v,u),这样可以保证处理出所有不回头的路径。
    总时间复杂度 O(m2logm+43LlogL)Code

24. JOISC 2018 Day 3 Security Gate

Tag:D-计数 DP。
将左括号转为 1,右括号转为 1,取前缀和 Si,则翻转 [l,r] 时(满足 Sn2(SrSl1)=0,即 Sr=Sn/2+Sl1):

Si={Sii[1,l)2Sl1Sii[l,r]SiSni(r,n]

注意到字符串合法当且仅当 Si0Sn=0,可以看成 Si0SiSn0,后者也就是翻转后取反的前缀和。

Case 1. 原本就合法

直接 fi,x 表示当前在 iSi=x 的方案数,则答案为 fn,0O(n2)

Case 2. Si0 或者 SiSn0

默认 SiSn 但存在 Si<0,则必然有 Si=1,取最早的满足 Si=1 的位置 p,则有 lp
对于 i>r,此时一定合法,取最大的 Sl1,令其为 A,令 B=Sn,则取 r 为第一个 A+B/2 出现的位置,接下来只需满足 [l,r] 内均 2A 这一条限制。
首先预处理出 l 相关的信息,令 fi,j,k 表示 [1,i] 满足 Si=j,且 Si 的前缀最大值为 k 的答案,则可以求出 Fi,k 满足 [1,i] 满足 Si=1Si 的前缀最大值为 k 的总方案数。
A+B/20,则 r<p,那么一定会满足限制。
否则有 SrSn=AB/2,尝试枚举 x=AB/2,令 gi,j,0/1[j,n] 中,当前的后缀和为 k,是否已经选定了 r
DP 转移是类似的,但是 gi,j,1 有值需要满足:j0j2x 的限制。
统计答案只需要计算:A=0ni=1nfi,Agi+1,B1,[A+B/2<0]
总复杂度 O(n3)

Case 3. Si0 并且 SiSn

同上,令第一个 Si=1 的位置是 p,最后一个 SiSn=1 的位置是 q
[1,p]Si 最大是 ASn 最大是 B,则同上要在 [q,n] 里找一个 A+B/2
[q,n]Si 最大是 C,则要求 A+B/2C,否则需要翻转并取反序列才能满足条件。
同上 DP,对前缀的 DP 不变,对后缀的 DP 第三维需要改成 0/1/2 以表示是否确定 r,q,转移也是类似的。
则答案是 A=0ni=1nfi,Agi+1,B1,2,注意 A+B/2=C 会算重一次,需要减掉,O(n3)


总时间复杂度 O(n3)Code,好难啊,想了一点就完全不会了。

25. 牛客多校 2019 R9 A. The Power of Fibonacci

Tag:M-CRT;M-斐波那契循环节。
尝试扩域但模数为合数,无法扩域,很难过。
尝试 CRT,发现 109=29×59,于是只需要求出两个合数的答案即可。
矩阵快速幂还是很难,但是可以尝试找循环节,让我写个暴力看看。
暴力写出来发现 π(29)=768π(59)=7812500,这些都可以暴力求。
于是 CRT 一下就行了,复杂度 O(π(59)log59)Code

26. 牛客多校 2019 R9 I. KM and M

Tag:M-扩展欧几里得;H-按位考虑。
枚举 M 的某一位为 1 的位 i,则只需要求出:

kkM2imod2=kkM2i2kkM2i+1

施类欧几里得算法即可,复杂度 O(log2M)Code

27. 牛客多校 2019 R9 F. Birthday Reminders

Tag:D-计数 DP。
fi,j,k 表示前 i 天共有 j 个人送礼,且第 i 天有 k 个人送礼的总方案数。
转移只需要枚举第 i1 天有几个人送礼,注意这里送礼有上下界:

  • 上界:jk
  • 下界:kaiai 表示有 ai 个人在 k 这个时间送礼。
    直接 DP 得到复杂度 O(n4)Code

28. USACO 2023.12 A Graph Problem P

Tag:G-Kruskal 重构树;S-线段树。
先建立 Kruskal 重构树,这样可以将每个节点的答案拍平到线段树上维护。
而后按顺序考虑每一个非叶子节点,这个叶子节点对应的两棵子树都需要:对于一边 iSu,fi10sizv+1+fvfi,写个线段树就行了,复杂度 O(nlogn)Code

29. USACO 2023.12 Cowntact Tracing P

Tag:D-树形 DP;H-性质。
恐怖题目,复读一下官方题解,可能会有纰漏。首先先做预处理:处理出所有可以作为源头的点,这可以使用一次多源 BFS 实现。
有一个简单的 DP 是 fu,k 表示 u 子树内最少的选点个数,满足 k>0:这个子树可以向外覆盖的距离为 kk<0:这个子树需要外面的点向内覆盖的距离为 k,转移是一个树形背包形式,可以做到单组询问 O(Tn)
Iu 表示 u 中不可能被子树外的点来覆盖的点集,令 fu 表示在 u 中选点使得 Iu 被完全覆盖的最小选点数,则有结论:vson(u)fvfuvson(u)fv+1
证明:左端是简单的,忽略,考虑右边。令此时的 fv 均为最优决策:即可以尽可能向外覆盖则向外覆盖的决策。假设在所有的节点中未被覆盖的节点的最深 depd,则我们可以找到一个 w,满足 d(w,v)Td,其可以覆盖到所有未被覆盖的节点,所以这个 w 选上之后可以覆盖掉整个子树,如果 w 在子树外面则说明这些节点均属于 Iu
接下来只需要维护所有最优决策,每次向上的时候合并决策,只有在根或者 w 已经确定在 u 子树的时候才给答案增加,w 确定在 u 子树内是好判断的,由此做到单组询问 O(n)Code

posted @   cnyz  阅读(278)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示