Loading

模拟赛 2024.2.13 解题报告

场切两题,感动

A. 统计

原 AGC028D

题意:园上均匀分布着 \(2n\) 个点,把一对一对点两两匹配,匹配的两个点之间画一条线,线的连接和交叉使一些点连通。给出一些已有的固定的匹配边,求所有匹配情况的连通块数之和,摸 \(10^9+7\)\(1\le n\le 300\)

乱猜结论题。手玩 \(6\) 个点的情况,发现似乎可以枚举一个不包含 \(1\) 的区间,然后该区间和区间外的点不连通的方案数为贡献。

几乎每种情况都被计算了 连通块数 \(-1\) 次,我们只需要加上所有匹配方案数即可。

这是错误的。把 \(15\) 种情况画出来,发现对于一组匹配 \(1-2,3-4,5-6\),他在 \([3,4],[5,6],[3,6]\) 被贡献,共 \(3\) 次,再加上最后的一共 \(4\) 次,多一次的原因是两个连通块合起来恰好是一个区间。

我们考虑为什么其他不会算多:正是因为其他情况的对应区间不能划分成两个不连通的子区间。设 \(f[i,j]\) 表示 \([i,j]\) 这个区间内的点不与区间外的点连通的方案数,\(g[i,j]\) 表示把 \([i,j]\) 这个区间不与区间外的点连通,且不能划分成两个不连通的子区间的方案数。

注意“不能”,考虑容斥,枚举 \([i,j]\) 中第一个可以划分的分界点 \(k\),则:

\[g[i,j]=f[i,j]-\sum_{k=i}^j g[i,k]\cdot f[k+1,j] \]

然后 \(f[i,j]\) 直接统计一下就能求,时间复杂度 \(O(n^3)\)

C. 狩猎

原题,有很多来源,比如 GDKOI2024PJ

题意:有 \(n\) 个怪,血量分别为 \(a_1,a_2,...,a_n\),但是不知道每个怪对应哪个血量。你每次选择一个怪打他一下,一个血量为 \(x\) 的怪被打 \(x\) 次后会死亡,求最差情况下最少打多少次能打死 \(m\) 个怪。\(1\le n,m\le 2000\)

首先一个怪你不可能先打一下,然后去打别的怪,然后再回来打。要么打到一半停止,要么打完。

顺序是无关的,可以把 \(a_1,a_2,...,a_n\) 从小到大排序。

打一个怪时,我们打了 \(a_i\) 次后还没死,说明他的血量不可能是 \(a_{1...i}\),我们可以通过这样来检验他的血量。

打一个怪之前,我们定一个“检验标准”,设为 \(a_x\),打 \(a_x\) 后如果还没打死就放弃。

猜一个结论:我们打怪时,“检验标准”只会变小,不会变大。

比较直观,如果变大,是不是和之前的小的交换了更好?

\(f[i,j]\) 表示 \(j\) 个怪,血量为 \(a_{1...j}\),打死 \(i\) 个的答案。

枚举当前的“检验标准” \(a_k\),最坏情况下我们先打血量为 \(a_{k+1...j}\) 的,然后打 \(a_k\) 的,则

\[f[i,j]=\min_{k=1}^j\{f[i-1,k-1]+a_k(j-k+1)\} \]

斜率优化,\(O(nm)\)

posted @ 2024-02-13 21:14  Lgx_Q  阅读(7)  评论(0编辑  收藏  举报