2024年2月 校内集训

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

2024.2.13 T1 统计

其实就是 [AGC028D] Chords

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

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

考虑对每个连通块计算贡献,设 \(f_{i,j}\) 表示区间 \([i,j]\) 内任意连边,且 \(i,j\) 在同一个连通块的方案数。发现这个连通块长度一定是偶数,且内部的点不能往外连边,这是有利于统计的。预处理 \(g_i\,(i\bmod 2=0)\) 表示 \(i\) 的点任意两两连边的方案数,则 \(g_i=g_{i-2}\times (i-1)=(i-1)!!\)。预处理 \(cnt_{i,j}\) 表示区间 \([i,j]\) 内未确定连边的点的数量。

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

\[f_{i,j}=g_{cnt_{i,j}}-\sum\limits_{k=i+1}^{j-1}f_{i,k}\times g_{cnt_{k+1,j}} \]

答案即 \(\sum\limits_{i,j}f_{i,j}\times g_{2n-2k-cnt_{i,j}}\)

时间复杂度 \(\mathcal{O}(n^3)\)

code

2024.2.13 T3 狩猎

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

根据样例 2 提示,将 \(a_i\) 从大到小排序,设想要打的序列是 \(\{x_i\}\),满足 \(a_{x_i}\ge a_{x_{i+1}}\),那么我们其实只需要最小化 \(\sum\limits_{i=1}^{m}{a_{x_i}(x_i-x_{i-1})}\)

\(f_{i,j}\) 表示前 \(i\) 个怪物,打了 \(j\) 个的答案,则有转移 \(f_{i,j}=\min\{f_{k,j-1}+a_i\times(i-k)\}\),暴力转移是 \(\mathcal{O}(n^3)\) 的。

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

code

2024.2.14 T1 挖宝

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

\(n,q\leq 10^6\)

钦定 \(d_a>d_b\)。大力分类讨论:

  • \(x\)\(a,b\) 简单路径上,则 \(d_a+d_b=dis(a,b)\)
  • \(x\)\(b\) 子树内,则 \(d_a-d_b=dis(a,b)\)
  • \(x\)\(lca\) 的祖先或儿子,则 \(d_a=dis(a,lca)=d_b-dis(b,lca)\)
  • \(x\) 是从 \(lca\) 往上走再往下走到的某个点。
  • \(x\)\(a,b\) 简单路径上的某个节点的子树内,设这个节点为 \(v\),则 \(d_a-dis(a,v)=d_b-dis(b,v)\)\(dis(a,v)+dis(b,v)=dis(a,b)\)

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

预处理每个点往上走再往下能到达的最大深度的点 \(h_x\),还有每个点往下走能到达的最大深度的点 \(son_x\),并将 \(x\) 的每个儿子 \(y\)\(son_y\) 从大到小排序。

对于 case 2,发现直接用 \(son_b\)\(b=lca\) 时可能会出错,所以只处理 \(b\ne lca\)\(b=lca\) 放到 case 5。

对于 case 3 的往上走部分,先判断 \(lca\) 到根行不行,再判断 \(lca\)\(h_{lca}\) 行不行即可。往下走的部分放到 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

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

只用设 \(f_{l,r}\) 表示吃完了 \(l\sim r\) 的派的最大体重。转移即枚举断点 \(k\),枚举吃的奶牛 \(T\),需满足 \(l\le L_T\leq k\leq R_T\leq r\),则有 \(f_{l,k-1}+f_{k+1,r}+w_T\rightarrow f_{l,r}\)。预处理 \(g_{k,l,r}\) 表示满足上述条件的最大的 \(w\) 即可 \(\mathcal{O}(n^3)\)

code

2024.2.15 T2 Bessie's Snow Cow P

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

不是很难的数据结构题。

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

code

2024.2.16 T1 楼房搭建

有一个均为 \(0\) 的序列 \(\{a_i\}\),给定 \(\{h_i\}\)。每次操作可以选定 \(i(1\leq i<n)\),使 \(a_i\leftarrow a_i+1,a_{i+1}\leftarrow a_{i+1}+2\) 或者 \(a_i\leftarrow a_i+2,a_{i+1}\leftarrow a_{i+1}+1\)。求至少要多少次操作才能使 \(\forall i,a_i\ge h_i\)

\(n,V\leq 10^6\)

反悔贪心………………

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

考虑如下的反悔:

  • 反悔之前的 \(a_i+2,a_{i+1}+1\):改成两次 \(a_i+1,a_{i+1}+2\),这样保证 \(a_i\) 不变,用 \(1\) 的代价使 \(a_{i+1}+3\)
  • 反悔之前的 \(a_i+3\):改成一次 \(a_i+1,a_{i+1}+2\) 和一次 \(a_i+2,a_{i+1}+1\),这样 \(a_i\) 不变,用 \(1\) 的代价使 \(a_{i+1}+3\)
  • 反悔之前的 \(a_i+3\):改成三次 \(a_i+1,a_{i+1}+2\),这样用 \(2\) 的代价使 \(a_{i+1}+6\)

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

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

code

2024.2.16 T3 数字收藏

给定 \(n,k\),维护一个可重集,支持插入、删除一个数,每次操作后询问 \(\sum\limits_{i=1}^n\sum\limits_{j=i+1}^n[\gcd(a_i,a_j)=k]\)

\(k\) 没卵用,全部数先除以 \(k\),转化成求集合内互质的数的个数。莫反一下得 \(\sum\limits_{d=1}^V\mu(d)\times \dbinom{f(d)}{2}\),其中 \(f(d)\) 表示集合内 \(d\) 的倍数的个数。

预处理每个数的约数,每次只需关注答案变化量,复杂度 \(\mathcal{O}(q\times \sigma(V))\)

code

2024.2.17 T3 人生

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

  • 把每个无色的点涂上黑色或白色。
  • 对于 \(\forall 1\leq i<j\leq n\),你可以选择连一条 \(i\rightarrow j\) 的有向边。

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

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

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

\(1\leq n\leq 2\times 10^5\)

\(g_i\) 表示以 \(i\) 点结尾的合法路径的数量在模 \(2\) 意义下的值。则 \(g_i=(\sum\limits_{j=1}^{i-1}[c_i\ne c_j]g_j)\bmod 2\oplus 1\)。发现 \(g_i\) 取值只和颜色和自己不同且 \(g_j=1\)\(j\) 的个数 \(k\) 有关。若 \(k\) 是偶数,则 \(g_i=1\),否则 \(g_i=0\)

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

\[f_{i,j,x,y}\times cnt(x,0)\times 2^{i-x}\rightarrow f_{i+1,j\oplus 1,x,y+1} \]

\[f_{i,j,x,y}\times cnt(x,1)\times 2^{i-x}\rightarrow f_{i+1,j,x,y} \]

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

白色的转移同理。

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

code

2024.2.19 T1 得分

其实就是CF639E Bear and Paradox

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

调整法得若 \(i<j\),则 \(\dfrac{t_i}{a_i}\leq\dfrac{t_j}{a_j}\)

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

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

code

2024.2.20 T1 区间求解

一个长度为 \(n\) 的序列的 \(\{a_i\}\),一个正整数 \(m\)\(q\) 次询问,每次询问区间 \([l,r]\) 中有多少个子序列满足 \(l\leq p_1<p_2<\dots<p_k\leq r\)\(\sum\limits_{i=1}^ka_{p_i}\bmod m=0\),空序列也是一种方案。

\(n,q\leq 2\times 10^5\)\(m\leq 20\)

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

code

2024.2.20 T2 无线网络

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

2024.2.21 T1 千岛之国

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

很厉害的 dp,不会做。

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

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

对于左下的处理同理。时间复杂度 \(\mathcal{O}(n+M^2)\)

code

2024.2.21 T2 监控

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

code

2024.2.22 T1 座位表

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

\(1\leq n\times m\leq 80\)\(1\leq k\leq \min(20,n\times m)\)

设期望为 \(E\),合法的方案个数为 \(x\),总方案个数为 \(s\),则 \(E=\dfrac{x}{s}+\dfrac{s-x}{x}(E+1)\),解得 \(E=\dfrac{s}{x}\)。显然 \(s=\binom{nm}{k}\)。现在考虑求 \(x\)

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

code

2024.2.28 T1 链

其实就是 P6142 [USACO20FEB] Delegation P

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

先二分答案 \(k\)

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

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

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

时间复杂度 \(\mathcal{O}(n\log ^2n)\)

code

2024.2.28 T2 三角形

其实就是 P6143 [USACO20FEB] Equilateral Triangles P

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

把图旋转,做四次。时间复杂度 \(\mathcal{O}(n^3)\)

code

2024.2.29 T3 线段并

其实就是 P6144 [USACO20FEB] Help Yourself P

先考虑 \(k=1\) 怎么做。

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

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

  • 对于 \(r_j\in[1,l_i)\)\(f_i\leftarrow f_j+1\)
  • 对于 \(r_j\in [l_i,r_i)\)\(f_i\leftarrow f_j\)
  • 对于 \(r_j\in[r_i,2N]\),此时 \(i\)\(j\) 完全包含。因为后面的线段比较相对位置时是按 \(r\) 比较,所以 \(f_j\) 不能贡献到 \(f_i\),应该是 \(f_j\leftarrow f_j\times 2\)\(i\) 选或不选)。

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

现在考虑 \(k\ne 1\)

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

由二项式定理得 \((x+1)^k=\sum\limits_{i=0}^kC_k^i\,x^i\)。由于 \(k\) 不大,维护 \(x^k\) 即可。

时间复杂度 \(\mathcal{O}(nk^2+nk\log n)\)

posted @ 2024-02-16 22:02  xishanmeigao  阅读(24)  评论(0)    收藏  举报