做题记录 25.8.15

\(\textcolor{purple}\odot\) CF1578M The Mind

显然具体方案只和 \(a_1\) 有关

\(a_1\le x\) 的概率大约为 \(1-\left(1-\frac x{100}\right)^5\),由此可以得到前 \(\frac i6\mid 0\le i\le 5\) 概率时的值 \(v_i\),大约为 \([0, 3.58, 7.79, 12.94, 19.73, 30.12, 100]\)

\(a_1\in(v_{i-1},v_i]\) 时恰好在第 \(i\) 次出牌即可(即第 \(i\) 次概率为 \(1\),其余概率为 \(0\)),可证成功率为 \(\frac 56\),略高于 \(85\%\)

代码

参考

\(\textcolor{purple}\odot\) CF1578B Building Forest Trails

将环从 \(n-1\) 处断开,放到链上处理

显然用并查集维护连通性,问题转化为每次给定 \((x,y)\),快速找到与之相交的连通块

每个连通块 \(S\),设其中的点从左到右依次为 \(s_{1\sim k}\),则 \(s_1-s_2\)\(s_2-s_3\)\(\cdots\)\(s_{k-1}-s_k\) 之间连边

\(p_i\) 表示点 \(i\) 上方 的边的数量,显然相邻的 \(p\) 之差不超过 \(1\)

假设目前要合并 \(S\)\(T\) 两个连通块

对于每个连通块 \(S\) 保存 \(l_S=s_1\)\(r_S=s_k\),若 \(l_S\le r_S<l_T\le r_T\),则令 \(p_{r_S+1\sim l_T-1}\) 加一,否则必有 \(l_S<l_T\le r r_T<r_S\)\(l_T<l_S\le r_S<r_T\),前者需要 \(p_{l_T\sim r_T}\) 减一,后者同理

用线段树维护 \(p\)

假设要连接 \(u,v\),且 \(u<v\)

\(p_u=p_v\),找到 \((u,v)\) 中第一个 \(p\) 小于 \(p_u\) 的位置 \(s\),显然与 \(s\) 所在连通块相交,合并之,否则无法合并,退出

\(p_u>p_v\),同样找到 \(s\)(此时一定存在)并合并,\(p_u<p_v\) 则找到 \((u,v)\) 中最后一个小于 \(p_v\) 的位置并与 \(v\) 合并

时间复杂度 \(O(n\log n+m\alpha(n))\),注意常数

代码

参考

[2025“钉耙编程”中国大学生算法设计暑期联赛(9) 1005] 计算几何

对于所有极大共线子段,只保留第一个和最后一个点,特殊处理收尾,显然这样得到的 \(k\) 最优

对于每个点,求出它指向前后两个点的向量的叉积是否为正,要么对于所有点,它被包裹当且仅当其对应叉积为正,要么都为负,显然 \(x\) 坐标最小的一个点必然被包裹,用它修正结果即可

时间复杂度 \(O(\sum n\log n)\),瓶颈在于输出时的排序

注意 \(2\times (2\times 10^9-(-2\times10^9))^2\) 大于 LLONG_MAX,因此需要用 __int128_tuint64_t

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(9) 1002] 预处理器

记录 \((a_1,b_1)\;\;op_1\;\;(a_2,b_2)\;\;op_2\;\;\cdots\;\;op_{k-1}\;\;(a_k,b_k)\),其中 \(op_i\in\{\times,+,<<\}\)\(a_i\) 表示值 \(\bmod M\)\(b_i\) 表示值 \(\bmod (M-1)\)

求值时先将 \(\times\) 的从左到右缩在一起,然后是 \(+\),最后是 \(<<\)

拼接时直接将序列用对应符号连接即可

显然这样时间复杂度为 \(\~O(2^n)\)

显然任意情况下,\(op_i=(\times)\) 时可以将 \((a_i,b_i)\)\((a_{i+1},b_{i+1})\) 缩起来

然后对于任意 \(op_i=(+)\;(1<i<k)\) 也可以缩起来

\(op_{i-1}=op_i=op_{i+1}=(<<)\),则可以把 \((a_i,b_i)\;\;<<\;\;(a_{i+1},b_{i+1})\) 缩为 \((a_i+a_{i+1},b_i+b_{i+1})\)

显然这样处理后,\(k\) 为常数

时间复杂度 \(O(n)\),常数极大

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(9) 1010] 阿斯蒂芬

显然最优情况下同一 \(\text{SCC}\) 状态相同,且一个 \(\text{SCC}\) 沉寂当且仅当 它不是单点且缩点后能到达它的 \(\text{SCC}\) 中存在 \(a>0\)它是单点且缩点后能到达它的非单点 \(\text{SCC}\) 中存在 \(a>0\)

实现是容易的,时间复杂度 \(O(\sum (n+m))\)

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(9) 1107] 三角剖分

将三角形看做点,两个三角形相邻则连边,选择任意一个两边为多边形边的三角形为根,显然得到一棵树

对于一个三角形,若它与它父亲之间相邻的一条边为 \(u-v\),且 \(u<v\),则用 \((u,v)\) 表示这个三角形

\(dp_{u,i}=(f,g)\) 表示点 \((u,v)\) 子树内 \(u,v\) 相连、不相连时的方案数,其中 \(v\)\(u\) 的第 \(i\) 条出边指向的点(根据指向的点排序,从 \(0\) 开始编号)

设点 \((u,v)\) 为三角形 \((u,v,w)\),其中 \(u<w<v\)\(w\)\(u\)\(i-1\) 条出边指向的点,则 \(w-v\)\(w\) 所有出边中最大的一条(若不是,设最大的一条为 \(w-k\),则 \(w-k\)\(u-v\) 相交,不合法)

显然 \(dp_{u,0}=(1,1)\)(两个点,连与不连各一种方案),转移为

\[dp_{u,i}=dp_{u,i-1}+dp_{w,|dp_w|-1} \]

其中 \((f_1,g_1)+(f_2,g_2)=(f_1g_2+f_2g_1+f_1f_2,f_1g_2+f_2g_1)\)

\(d(f,g)=f-g\) 表示不通过 \(u,v\) 就能连接的方案数,统计答案时,令 \(dp'_{u,i}\) 表示子树以外部分的答案,转移类似,则答案为 \(\sum_u \sum_i d(dp_{u,i})g(dp'_{u,i})+g(dp_{u,i})d(dp'_{u,i})\)

时间复杂度 \(O(n\log n)\),瓶颈在于排序,容易做到 \(O(n)\)

代码

posted @ 2025-08-16 07:43  Hstry  阅读(24)  评论(0)    收藏  举报