2024年2月 校内集训

🐀🐂🐅🐇🐉🐍🐎🐏🐒🐓🐕🐖

2024.2.13 T1 统计

其实就是 [AGC028D] Chords

先破环为链,把圆上的点转化到区间上,那么圆上两条线段有交则在区间上相交但不包含。

对于一个连通块来说,连通块内的点肯定在一个区间内,且区间端点属于连通块。但是不是区间内的所有点都是这个连通块,可能还有小连通块。

考虑对每个连通块计算贡献,设 fi,j 表示区间 [i,j] 内任意连边,且 i,j 在同一个连通块的方案数。发现这个连通块长度一定是偶数,且内部的点不能往外连边,这是有利于统计的。预处理 gi(imod2=0) 表示 i 的点任意两两连边的方案数,则 gi=gi2×(i1)=(i1)!!。预处理 cnti,j 表示区间 [i,j] 内未确定连边的点的数量。

fi,j=gcnti,j,但这样显然是不对的,因为还需满足 i,j 在同一连通块。考虑容斥,枚举与 i 在同一个连通块的最右端点 k,则

fi,j=gcnti,jk=i+1j1fi,k×gcntk+1,j

答案即 i,jfi,j×g2n2kcnti,j

时间复杂度 O(n3)

code

2024.2.13 T3 狩猎

其实就是 P10074 [GDKOI2024 普及组] 刷野 III

根据样例 2 提示,将 ai 从大到小排序,设想要打的序列是 {xi},满足 axiaxi+1,那么我们其实只需要最小化 i=1maxi(xixi1)

fi,j 表示前 i 个怪物,打了 j 个的答案,则有转移 fi,j=min{fk,j1+ai×(ik)},暴力转移是 O(n3) 的。

发现转移式里有乘积项,容易想到斜率优化,则 fk,j1=ai×k+fi,jai×i。即令斜率为 ai 的直线过每个点 (k,fk,j1),最小化截距。斜率 ai 单调递减,使用单调栈维护。枚举时应先枚举 j 再枚举 i,否则会 fi,j1fi,j,而且这样写只需要开一个栈,方便。

code

2024.2.14 T1 挖宝

给定一棵树,q 次询问,每次给出 a,b,da,db,任意输出一个点,满足这个点到 a,b 的距离分别是 da,db,无解输出 1

n,q106

钦定 da>db。大力分类讨论:

  • xa,b 简单路径上,则 da+db=dis(a,b)
  • xb 子树内,则 dadb=dis(a,b)
  • xlca 的祖先或儿子,则 da=dis(a,lca)=dbdis(b,lca)
  • x 是从 lca 往上走再往下走到的某个点。
  • xa,b 简单路径上的某个节点的子树内,设这个节点为 v,则 dadis(a,v)=dbdis(b,v)dis(a,v)+dis(b,v)=dis(a,b)

具体实现细节很多,为了方便,可以先处理往上走的,再处理往下走的。

预处理每个点往上走再往下能到达的最大深度的点 hx,还有每个点往下走能到达的最大深度的点 sonx,并将 x 的每个儿子 ysony 从大到小排序。

对于 case 2,发现直接用 sonbb=lca 时可能会出错,所以只处理 blcab=lca 放到 case 5。

对于 case 3 的往上走部分,先判断 lca 到根行不行,再判断 lcahlca 行不行即可。往下走的部分放到 case 5。

case 1 也可以放到 case 5。

对于 case 5,先解方程算出有没有这样的 v,再在 v 的子树内选一个合法的子树往下跑即可。

code

2024.2.15 T1 Greedy Pie Eaters P

其实就是 P5851 [USACO19DEC] Greedy Pie Eaters P

一开始设了三维状态,但其实只需要两维。

只用设 fl,r 表示吃完了 lr 的派的最大体重。转移即枚举断点 k,枚举吃的奶牛 T,需满足 lLTkRTr,则有 fl,k1+fk+1,r+wTfl,r。预处理 gk,l,r 表示满足上述条件的最大的 w 即可 O(n3)

code

2024.2.15 T2 Bessie's Snow Cow P

其实就是 P5852 [USACO19DEC] Bessie's Snow Cow P

不是很难的数据结构题。

维护子树容易想到 dfs 序。发现每次修改的区间不会交叉,只会相离或完全包含。于是对于每种颜色开一个 set,记录已经有的区间,在修改大区间的时候,把小区间先删掉。复杂度有保障。

code

2024.2.16 T1 楼房搭建

有一个均为 0 的序列 {ai},给定 {hi}。每次操作可以选定 i(1i<n),使 aiai+1,ai+1ai+1+2 或者 aiai+2,ai+1ai+1+1。求至少要多少次操作才能使 i,aihi

n,V106

反悔贪心………………

一个错误的贪心:从前往后遍历,优先执行 ai+2,再执行 ai+1,但这样显然错误。

考虑如下的反悔:

  • 反悔之前的 ai+2,ai+1+1:改成两次 ai+1,ai+1+2,这样保证 ai 不变,用 1 的代价使 ai+1+3
  • 反悔之前的 ai+3:改成一次 ai+1,ai+1+2 和一次 ai+2,ai+1+1,这样 ai 不变,用 1 的代价使 ai+1+3
  • 反悔之前的 ai+3:改成三次 ai+1,ai+1+2,这样用 2 的代价使 ai+1+6

因为反悔必须保证 ai 不变,所以可以证明这样的反悔是足够的。

记录下前面用了多少个 ai1+2,ai+1 和 多少个 ai+3,即可知道能用多少次 ai+3。对于不够的部分,优先 ai+2 即可。时间复杂度 O(n)

code

2024.2.16 T3 数字收藏

给定 n,k,维护一个可重集,支持插入、删除一个数,每次操作后询问 i=1nj=i+1n[gcd(ai,aj)=k]

k 没卵用,全部数先除以 k,转化成求集合内互质的数的个数。莫反一下得 d=1Vμ(d)×(f(d)2),其中 f(d) 表示集合内 d 的倍数的个数。

预处理每个数的约数,每次只需关注答案变化量,复杂度 O(q×σ(V))

code

2024.2.17 T3 人生

一张 n 个点的无向图,一开始这张图没有边,每个点可能是黑色、白色、或无色,现在你要把这张图补充完整:

  • 把每个无色的点涂上黑色或白色。
  • 对于 1i<jn,你可以选择连一条 ij 的有向边。

定义一条路径是合法的当且仅当路径上相邻的点颜色不同,可以只经过一个点。

定义一张图是合法的当且仅当路径合法数量为奇数。

求有多少种方案使得图是合法的。

1n2×105

gi 表示以 i 点结尾的合法路径的数量在模 2 意义下的值。则 gi=(j=1i1[cicj]gj)mod21。发现 gi 取值只和颜色和自己不同且 gj=1j 的个数 k 有关。若 k 是偶数,则 gi=1,否则 gi=0

因此设 fi,j,x,y 表示前 i 个点,合法路径条数模 2j,有 x 个白点满足 g=1,有 y 个黑点满足 g=1。转移即考虑 i+1 点的染色,若将 i+1 染成黑色,则

fi,j,x,y×cnt(x,0)×2ixfi+1,j1,x,y+1

fi,j,x,y×cnt(x,1)×2ixfi+1,j,x,y

其中 cnt(x,0/1) 表示从 x 个点里选偶数/奇数个点的方案数。

白色的转移同理。

注意到 x>0cnt(x,0/1)=2x1,而 x=0cnt(x,0)=1,cnt(x,1)=0。因此转移只和 x,y 是否大于 0 有关。因此设 fi,j,x,y 表示前 i 个点,合法路径条数模 2j,白点满足 g=1 的数量是否大于 0,黑点满足 g=1 的数量是否大于 0。时间复杂度 O(n)

code

2024.2.19 T1 得分

其实就是CF639E Bear and Paradox

考场上用假做法通过了……

调整法得若 i<j,则 tiaitjaj

问题是当上述式子左右两边相等时内部该如何排序??仔细观察样例 2 我猜想把 a 次大的放第一个,a 最大的放最后,中间乱放即可。这在 GJOJ 上获得了满分的好成绩,可惜是假的……

其实我们不用知道那一段里面时怎么排的,重点在于如何取到最劣的情况。分析,当这一段中有一个出现了 Paradox 时,即 ai>ajai(Tcxi)<aj(Tcxj)。要想让其满足这样的关系,则要让 xi 尽量大,xj 尽量小。所以对于一道题,在作为 i 时放最后面,作为 j 时放最前面即可。

code

2024.2.20 T1 区间求解

一个长度为 n 的序列的 {ai},一个正整数 mq 次询问,每次询问区间 [l,r] 中有多少个子序列满足 lp1<p2<<pkri=1kapimodm=0,空序列也是一种方案。

n,q2×105m20

猫树分治,对于区间 [l,r],将跨过 mid 两边的询问存储在当前节点,而分别在两个子区间内部的询问则下放。对于每个区间,预处理 prei,j 表示区间 [l,i] 有多少种子序列使得和模 mjsufi,j 表示区间 [j,r] 有多少种子序列使得和模 mj。那么当递归处理了 [l,mid][mid+1,r] 两个子区间后,左边的 sufi 对应的区间就是 [i,mid],右边的 prei 对应的区间就是 [mid+1,i],这就使我们可以直接统计答案。时间复杂度 O(nmlogn)

code

2024.2.20 T2 无线网络

怎么放 NOIP 模拟赛原题,没意思……

2024.2.21 T1 千岛之国

其实就是 P9272 [CEOI 2013] 千岛之国

很厉害的 dp,不会做。

当以每个点为中心的时候,左上和右下的可以一次到达,右上和左下要多次。画个图发现当你跳了一次后,左下和右上那个无法一次到达的矩阵的大小会越来越小。这取决于跳一次后那些点的横纵坐标的最小最大值。

以右上的矩阵为例,设 minr,maxc 分别表示往左上跳一次所到达的点的行/列的最小/最大值。则右上角那个矩阵从 (xi,yi)(1,M) 缩小到 (minr,maxc)(1,M)。设 fr,c 表示矩阵 (r,c)(1,M) 需要的步数,很容易写出状态转移方程 fr,c=cntr,c+fminr(r,c),maxc(r,c)

对于左下的处理同理。时间复杂度 O(n+M2)

code

2024.2.21 T2 监控

简单二分图匹配,没想出来纯粹是自己 sb……

code

2024.2.22 T1 座位表

n×m 个座位和 n×m 个人要做到这些位置上,其中有 k 个涉嫌作弊人不能坐在相邻的位置(行、列相邻)。现在要分座位,方式是随机分配,不符合要求则重新随机。求分配次数的期望。

1n×m801kmin(20,n×m)

设期望为 E,合法的方案个数为 x,总方案个数为 s,则 E=xs+sxx(E+1),解得 E=sx。显然 s=(nmk)。现在考虑求 x

由于 nm80,于是 min(n,m)8,选择小的那个作为列(m),设 fi,j,s,t 表示考虑到第 i 行第 j 列,前面的作弊的人的轮廓线状态为 s,已经放了 t 个涉嫌作弊的人。转移不表。可以把第一维去掉。时间复杂度 O(2min(n,m)nmk)

code

2024.2.28 T1 链

其实就是 P6142 [USACO20FEB] Delegation P

其实是简单题,但是自己太菜了。

先二分答案 k

对于一个节点 x,往父亲传递的链只有一条。记 fx 表示往上传的链的长度。如果有奇数个儿子,肯定是两两配对后剩下一条传上去。如果有偶数个儿子,就加个 0 变成奇数的情况。

考虑选哪条链,这东西也是有单调性的,可以再来一次二分。check 显然就是大配小。

如果是根节点的话就不用上传了,直接偶数两两配对即可。

时间复杂度 O(nlog2n)

code

2024.2.28 T2 三角形

其实就是 P6143 [USACO20FEB] Equilateral Triangles P

把等边三角形三个顶点垂直于坐标轴作两条辅助线,在三角形内部会交于一点。发现这一点到某两个顶点距离相等,到另一个顶点的曼哈顿距离等于到其他两个顶点的距离。于是考虑枚举这个点 (i,j),再枚举到某两个点的距离 d。钦定那两个点一定在正上方和正右方。发现剩下那个点一定在左下方一条斜率为 1 的直线上,预处理斜线前缀和即可。

把图旋转,做四次。时间复杂度 O(n3)

code

2024.2.29 T3 线段并

其实就是 P6144 [USACO20FEB] Help Yourself P

先考虑 k=1 怎么做。

同名金组就是 k=1,但是用那种设状态的方法放到这题是不行的。

先按左端点排序。设 fi 表示以第 i 条线段结尾的答案。分类一下:

  • 对于 rj[1,li)fifj+1
  • 对于 rj[li,ri)fifj
  • 对于 rj[ri,2N],此时 ij 完全包含。因为后面的线段比较相对位置时是按 r 比较,所以 fj 不能贡献到 fi,应该是 fjfj×2i 选或不选)。

用线段树维护上述操作,需要支持单点修改、区间求和、区间乘。

现在考虑 k1

其实就是考虑如何维护 (x+1)k

由二项式定理得 (x+1)k=i=0kCkixi。由于 k 不大,维护 xk 即可。

时间复杂度 O(nk2+nklogn)

posted @   xishanmeigao  阅读(9)  评论(0编辑  收藏  举报
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示