比赛记录(51~60)
51 CSP-S 模拟赛32
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(4\) | \(20\) | \(11\) | \(27\) | \(62\) |
排名:rank \(9\)。
真正炸裂的一集。
2 题解
T1 战争
考虑到边数较少,于是考虑能不能枚举边相关信息。通过部分分可以有如下讨论:
- \(c_u\ne c_v\) 时,意味着原先两点间有的边没了,那么两端的两个点只能选其一。
- \(c_u=c_v\) 时,意味着原先两点间没有边有了,那么这一条边可选可不选。
于是发现每一条边的决策只有两种,而边数 \(K\) 只有 \(20\),所以可以 \(O(2^K)\) 枚举边的状态。
接下来判断选择的边是否有冲突,以及每一个岛屿上选的边能不能构成完全图即可。
T2 肥胖
首先考虑没有吃糖果变胖的机制,我们怎么走可以使初始体重最大。这就是经典问题 [货车运输],显然走的路径一定是最大生成树上的路径。
那么有了这个机制这个性质也不会变,所以考虑在最大生成树基础上求解。又由于这是边权问题,考虑 Kruskal 重构树来解决。对于单次合并的两个子树 \(u,v\),设其子树权值和为 \(s_u,s_v\),子树本身最大答案为 \(a_u,a_v\),连接两子树边权为 \(w\)。
那么此时一定是先吃其中一颗子树,再吃另外一颗最优。假设先吃 \(u\),那么此时答案会变为 \(\min\{w-s_u,a_v-s_u\}\)。先吃 \(v\) 同理。
最后根节点的 \(a\) 即是答案。
T3 分摊
容易发现,整个给钱的过程就是将儿子从小到大填满,然后再一点点往父亲给。所以如果一个节点需要 \(k\) 的钱来填它的子树,那么子树权值和比 \(k\) 小的兄弟应该都被填满,其他的兄弟都应该填上 \(k\)。那么我们就可以知道它的父亲需要的钱是 \(\sum\min\{sum_x,k\}\)。
暴力跳的复杂度是 \(O(n^2)\),考虑优化。不难发现的是,如果在某一次跳的时候出现了 \(sum_x>k\) 的情况,那么 \(k\) 就会至少翻一倍。而 \(k\) 最多就是 \(V=\sum v_i\),所以出现上述情况的次数不超过 \(\log V\)。
考虑从这里入手,我们把这样的节点称为关键点,然后利用倍增求出每一个点跳到下一个关键点的价值和以及需要多少钱才能跳到该关键点。这样复杂度就是 \(O(n\log V)\) 的了。
T4 修路
52 CSP-S 模拟赛33
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(100\) | \(100\) | \(50\) | \(25\) | \(275\) |
排名:rank \(3\)。
2 题解
T1 构造字符串
直接上并查集。对于一组 \((x,y,z)\),我们将 \(x+i\) 与 \(y+i\) 连边,同时标记 \(x+z\) 与 \(y+z\) 要不同。求答案的时候从头开始贪心,求出冲突的集合中已经确定了的值,求出这些值的 \(\text{mex}\) 就是当前答案。
T2 寻宝
超级大水题,先 BFS 算出每个点与传送门的连通性,然后传递闭包算传送门之间连通性,最后查答案的时候枚举一下即可。上述过程全部可以 bitset 优化,复杂度 \(O(knm+\dfrac{k^3}{w}+\dfrac{qk^2}{w})\)。
T3 序列
首先发现 \(p\) 两边的 \(l,r\) 互不影响,因此先求出前缀和,则只需要让 \(sa_r-ksb_r\) 与 \(-sa_l+ksb_l\) 分别最大即可。
发现上面两个式子都是 \(y=kx+b\) 的一次函数的形式,也就是说每一个位置都对应一条直线。而我们要求的就是再 \(x=k\) 处与所有直线交点的最大值。这个就是李超线段树的经典问题了。
当然我们需要先离线,然后边插入边查询即可。
T4 构树
讲得很好。
53 CSP-S 模拟赛34
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(9\) | \(50\) | \(20\) | \(0\) | \(79\) |
排名:rank \(15\)。
依然炸裂的一集。
2 题解
T1 玩游戏
考虑从 \(k\) 处掰开序列,然后分别求前缀和。问题就转化为移动 \(l=r=1\) 两个指针,使得每一次的 \(s_l+s_r\) 都不大于 \(0\)。
考虑贪心。我们显然是每一次只将 \(l,r\) 中一个移到值更小的位置。但是这样只能将 \(l,r\) 分别移到最小值处。不过发现后面的移动倒过来和前面是一样的,所以倒过来再跑一边即可。
T2 排列
首先要观察到每一次会至少删一半的数,所以有效的 \(k\) 只有 \(\log n\) 个。
发现去掉序列最大值后两边可以分开求解。设 \(dp(i,j,0/1,0/1)\) 表示序列长度为 \(i\),不超过 \(j\) 次操作就删到不能再删的序列方案数。后面的 \(0/1\) 表示左 / 右是有一个比该序列所有数都大的数还是没有。接下来我们只需要枚举最大值位置、两个子区间的状态即可,复杂度 \(O(n^2\log n)\)。
转移方程大致如下:
(dp[i][j][0][0] += dp[k - 1][j][0][1] * dp[i - k][j][1][0] % Mod * C[i - 1][k - 1] % Mod) %= Mod;
(dp[i][j][0][1] += dp[k - 1][j][0][1] * dp[i - k][j - 1][1][1] % Mod * C[i - 1][k - 1] % Mod) %= Mod;
(dp[i][j][1][0] += dp[k - 1][j - 1][1][1] * dp[i - k][j][1][0] % Mod * C[i - 1][k - 1] % Mod) %= Mod;
int x = (dp[k - 1][j][1][1] - dp[k - 1][j - 1][1][1] + Mod) % Mod;
int y = (dp[i - k][j][1][1] - dp[i - k][j - 1][1][1] + Mod) % Mod;
(dp[i][j][1][1] += (dp[k - 1][j][1][1] * dp[i - k][j][1][1] % Mod - x * y % Mod + Mod) % Mod * C[i - 1][k - 1] % Mod) %= Mod;
T3 最短路
我们建立两张图,一张是原图,另一张是反图。于是原问题就相当于从两张图的原点走到终点的费用和。
考虑二维 Dijkstra,设 \(dis(x,y)\) 表示第一张图走到 \(x\),第二张图走到 \(y\) 所用费用最小值,使用与 Dij 相同的转移方式即可。为了维护已走过的车站,再开一个 bitset \(sta(x,y)\) 存此时走过的站点。转移时根据这个加上对应权值即可。
T4 矩形
显然使用扫描线,对于每一个区间维护当前覆盖该区间且删除时间最晚的矩阵,利用并查集更新即可。
具体还是看这里。
54 CSP-S 模拟赛35
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(100\) | \(0\) | \(15\) | \(44\) | \(159\) |
排名:rank \(6\)。
2 题解
T1 送花
考虑扫描线。我们枚举当前区间的左端点 \(l\),这样在 \(l\) 后面第一次出现的颜色权值可以看作 \(w_i\)、第二次出现的权值可以看作 \(-w_i\),此后出现颜色权值均为 \(0\)。这样我们只需要求出使和最大的 \(r\) 即可。
显然只需要存储每个点颜色下一次出现的位置,然后线段树上单点修改、区间查最大值即可。
T2 星空
首先转化题目中的式子,不难发现 \(||x_1-x_2|-|y_1-y_2||=\min\{|(x_1+y_1)-(x_2+y_2)|,|(x_1-y_1)-(x_2-y_2)|\}\)。所以令新的点的 \(x'=x+y,y'=x-y\),直接距离就可以转化。
接下来我们现将所有距离为 \(0\) 的点用并查集连起来,然后剩下点的最小距离必然直接是两点间的距离。于是分别按照 \(x,y\) 排序,找到它右边 / 上边第一个点并算出距离,即可求出最小值。
接下来找出距离为最小距离的联通块,然后相乘累加即可。
T3 零一串
考虑对每一个 \(1\) 维护一个长为 \(T\) 的序列,表示每一个时刻能否走,于是就可以方便求出第一问答案。
首先考虑第 \(i\) 个 \(1\) 与第 \(i+1\) 个 \(1\) 的关系。不难发现的是,如果第 \(j\) 次第 \(i\) 个 \(1\) 可以移动,那么第 \(j+1\) 次第 \(i+1\) 个 \(1\) 绝对可以移动。这相当于是将第 \(i\) 个 \(1\) 的串右移一位。
然后考虑 \(i+1\) 个 \(1\) 其他情况的移动,不难发现,如果第 \(i\) 个与第 \(i+1\) 个 \(1\) 之间隔了 \(k\) 个 \(0\),意味着 \(i+1\) 个 \(1\) 可以额外再多移 \(k\) 次才会和 \(i\) 碰上,所以此时还要将这个串前面的 \(k\) 个 \(0\) 换成 \(1\)。
不难发现如果我们只维护 \(0\) 的相对位置,这个序列的维护只需要在末尾删除、开头删除,因此双端队列维护即可。
至于第二问,实际上只需要将上面串纵向铺开,求出每一列上 \(1\) 之和即可。这个可以利用差分简单维护。
T4 Revive
首先将平方式子拆开,然后考虑分开维护贡献。
- 对于一条边的平方,贡献系数就是过这条边的路径数。即贡献为 \({w_u}^2\times siz_u\times(n-siz_u)\)。
- 对于任意两条边的成绩,贡献系数是过这两条边的路径数乘 \(2\)。此时需要分类讨论:
- 当 \(v\) 在 \(u\) 子树内时,贡献为 \(2w_u\times w_v\times (n-siz_u)\times siz_v\)。
- 当 \(v\) 是 \(u\) 的祖先时,贡献为 \(2w_u\times w_v\times (n-siz_v)\times siz_u\)。
- 否则贡献为 \(2w_u\times w_v\times siz_v\times siz_u\)。
对于每一次修改,只需要考虑 \(v\) 的贡献和即可。发现这些贡献只和 \(siz_v\times w_v\) 和 \(w_v\) 有关,用线段树 / 树状数组维护即可。复杂度可以做到 \(O(n\log n)\)。
55 CSP-S 模拟赛36
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(65\) | \(40\) | \(40\) | \(20\) | \(165\) |
排名:rank \(3\)。
2 题解
T1 b
考虑将题目转化为求有多少种选法使得 \(\gcd=i\),将答案记作 \(f(i)\),然后对于所有 \(i\) 求 \(\sum i\times f(i)\) 即可。又考虑到式子中有 \(\gcd\),进一步转化为求有多少种选法使得 \(i\mid\gcd\),将答案记作 \(g(i)\)。这样简单莫反 / 容斥后即可求出 \(f(i)\)。
考虑怎样求 \(g(i)\),我们求出每一行上 \(i\) 的倍数的个数 \(cnt_{x,i}\),这样 \(g(i)\) 就是 \(\prod(cnt_{x,i}+1)-1\)。直接计算即可。记 \(a_i\) 最大值为 \(x\),则复杂度为 \(O(n(m+x\ln x))\)。
T2 竞赛图
首先要了解竞赛图的一个性质:缩点后的 DAG 是一条链的形式,且每一个点会向所有拓扑序比它大的点连边。
于是我们可以得出这样一个结论:对于竞赛图上任意一个非强连通图,其一定包含一个强连通子图,且该子图的所有点都指向剩下的点集。
所以我们就可以考虑从强连通图扩展得到非强连通图。具体的,求出一个强连通图的 每一个点指向的点集 的交集,然后将这个交集的子集与原先的强连通图求并集,得到的一定是一个非强连通图。
暴力求解即可,复杂度 \(O(T2^n)\)。
T3 糖果
T4 树
我们考虑这样一种方式:初始时为树上所有节点给一个互不相同的编号。然后对于每一次修改,将要修改的链上的所有节点的颜色再改为同一种之前没有出现的颜色。这样操作完我们发现,对于一条边,如果两个端点颜色不同就是黑边,否则就是白边。
那么我们就可以用线段树来维护这一过程,具体操作与 [SDOI2011] 染色 基本一致。复杂度 \(O(n\log^2 n)\)。
56 CSP-S 模拟赛37
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(100\) | \(25\) | \(20\) | \(20\) | \(165\) |
排名:rank \(3\)。
md 什么败犬场。
2 题解
T1 莓良心
首先取出当前的 \(\max\{l_i\}\) 和 \(\min\{r_i\}\),如果 \(maxl<minr\),则说明所有区间都可以取到 \([minr,maxl]\),对答案的贡献就是 \(0\)。
否则说明这两个区间是隔离的,其他区间会覆盖 \([maxl,minr]\)。考虑此时我们怎样取答案最优,根据绝对值几何意义,显然所有数都取在 \([maxl,minr]\) 最优,且每个点的贡献都是 \(minr-maxl\)。然后接下来取出这两个极值对应区间,然后递归求解剩下的部分即可。
复杂度 \(O(n\log n)\)。
考场上写了一个非常傻逼的 \(O(R \log R)\) 做法,就不说了。
T2 尽梨了
我们考虑枚举 \(b\) 序列中 \(1\) 的个数,设其为 \(x\)。再设第 \(i\) 行 \(1\) 个数为 \(r_i\),接下来我们分类讨论:
- 如果 \(r_i>x\),那么选 \(0\) 剩下的 \(1\) 会多,所以必须选 \(1\)。
- 如果 \(r_i<x\),那么选 \(1\) 剩下的 \(0\) 会多,所以必须选 \(0\)。
- 如果 \(r_i=x\),那么这一行选什么都行。
考虑维护这样一个东西:设 \(pre_x\) 表示所有 \(r_i\le x\) 的 \(i\) 行上的 \(1\) 的并,\(nxt_x\) 表示所有 \(r_i\ge x\) 的 \(i\) 行上的 \(0\) 的并。这样对于一个固定的 \(x\),我们就知道 \(b\) 序列中哪些地方必须选 \(0\),哪些必须选 \(1\)。同时此时 \(pre_x\) 与 \(nxt_x\) 不能有交集。
接下来处理方案数。对于 \(r_i=x\) 的情况,选什么都可以,那么方案数就是 \(2^{cnt}\)。同时在上面规定的位置中,我们只规定了 \(n-pre_x-nxt_x\) 个位置,但此时还有 \(x-pre_x\) 个 \(1\) 没有确定。所以再乘上 \(\binom{n-pre_x-nxt_x}{x-pre_x}\) 即可。
T3 团不过
这道题与 [HNOI2011] 卡农 是一模一样的。考虑正难则反,设 \(f(i)\) 表示取 \(i\) 个数异或和为 \(0\) 的方案数,\(g(i)\) 表示取 \(i\) 个数的总方案数。通过与卡农类似的方法,可以得到转移方程。\(O(n)\) 转移即可。
T4 七负我
难点在于发现性质:答案一定是将时间平均分配到最大团上的节点最优。
这个命题有三个部分需要证明:团、平均分配、最大团。后两个可以看 byj 大佬的题解,这里证明为什么要取团。
如果不是最大团,则必然存在两个点不联通,或者只是间接连通。下面说明两种方案都不优。
- 考虑间接连通的两点 \(x,y\),设他们通过 \(x-a-b-y\) 连通。此时贡献为 \(t_xt_a+t_at_b+t_bt_y\),将 \(t_y\) 全部给 \(a\),贡献变为 \(t_x(t_a+t_y)+t_b(t_a+t_y)\),显然比刚才的贡献优。同理可以讲 \(t_x\) 全部给 \(b\)。
- 考虑不联通的两点 \(x,y\),设其连通块为 \(x-a,y-b\),此时贡献为 \(t_xt_a+t_yt_b\)。将 \(t_y\) 给 \(x\)、\(t_b\) 给 \(a\),贡献变为 \((t_x+t_y)(t_a+t_b)\),显然比刚才贡献优。
通过上述调整方式可知,让答案的图中任意两点相连不会更劣,所以答案取得是一个团。
那么只需要求出最大团大小即可。可以使用 Bron-Kerbosch 算法或者状压 + meet in the middle。前者复杂度更低一些。
57 临时起意加塞
1 得分
| 题目 | T1 | T2 | T3 | 总分 |
|---|---|---|---|---|
| 得分 | \(30\) | \(100\) | \(20\) | \(150\) |
总分:rank \(1\)。
2 题解
T1 Hunter
其实是期望简单题。我们考虑第 \(1\) 个人死的期望轮数实际上就是在它之前死的期望人数加一。根据期望线性性质,可以拆成每一个人在第 \(1\) 个人死之前死的期望总和加一,那么实际上就是每一个人在第 \(1\) 个人死之前死的概率总和加一。
考虑怎样求这个概率。我们可以根据比例计算,当要在 \(i\) 和 \(1\) 当中选一个人的时候,\(i\) 先死的概率自然是 \(\dfrac{w_i}{w_i+w_1}\),因此第 \(i\) 个人在第 \(1\) 个人死之前死的概率就是 \(\dfrac{w_i}{w_i+w_1}\)。求和即可。
T2 Defence
一眼线段树合并。考虑每一个工事修建最少次数,设使用所有法术后最左边的连续 \(0\) 长度为 \(a\),最右边的连续 \(0\) 长度为 \(b\),最长的 \(0\) 连续段长度为 \(m\),则次数为 \(\max\{a+b,m\}\)。线段树维护即可。
T3 Connect
考虑最终形成的图一定是一条 \(1\) 到 \(n\) 的链,然后链上挂了一些联通块(也有可能不和链联通)。可以分成两部分考虑,也就是链的部分和联通块的部分。
考虑使用状压 dp。设 \(dp(S,i)\) 表示已选点状态为 \(S\),链上最后一个节点为 \(i\) 的最大值。那么转移也就分上面两种:
- 将链从 \(i\) 扩展到 \(j\)。
- 将一个联通块连到 \(i\) 上。
分别枚举并转移即可。
58 CSP-S 模拟12(HZ 联考)
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(70\) | \(35\) | \(15\) | \(66\) | \(186\) |
排名:rank \(1\)。
2 题解
T1 小 h 的几何
数竞题。根据相关几何知识可知九点圆圆心在垂心 \(H\) 与外心 \(O\) 的中点上,又由于该三角形外心就是原点,所以题中的 \(\Omega(A,B,C)=\dfrac{A+B+C}2\),将贡献拆开计算累加即可。
T2 小 w 的代数
看到仙人掌不难想到利用圆方树,接下来考虑怎样 dp。我们枚举起点,然后设 \(dp(i,j)\) 表示走到 \(i\) 且链尾为 \(j\) 的方案数。我们在圆点处统计链尾为该点的方案数,方点处进行环形 dp 更新环上节点的 dp 值。
具体的,当我们进行环形 dp 时,分别从顺时针和逆时针走一遍。然后如果在整个环上我们只选了起点、终点而没有其他点,则两个方向本质上没有区别,因此出去的时候减掉对应贡献即可。
T3 小 y 的数论
首先考虑在一棵树上选 \(k\) 个点怎么做。显然要尽量选叶子,这样边权总和即为答案;但是 \(k\) 有可能小于叶子数量,此时我们应该优先选直径两端点,接下来以直径一段点为根做长链剖分,选出前 \(k-1\) 大的长链及链顶轻边权值和即可。
然后不难发现,对于两个点集 \([l,mid]\) 和 \([mid+1,r]\),如果我们已知他们的最优答案对应的 \(k\) 个点,那么点集 \([l,r]\) 的最优答案一定也产生于这 \(2k\) 个点中。
所以有一个显然做法:维护一棵线段树,在每一个区间维护最优点集。合并时将儿子的 \(2k\) 个点取出建虚树,从虚树中选 \(k\) 个点即可。这里就可以使用上面所述的全局做法了。不过这样做常数过大,无法通过。
所以我们考虑分块,我们每 \(k\) 个点分一块,然后块间的最优点集用 ST 表维护,查询时合并散块和整块信息即可。
T4 小 j 的组合
先不考虑 \(g\) 最小。我们如果想从根出发再回到根,实际上走 DFS 序即可。但是实际不可行的原因是每个点只能走一次。于是我们就可以利用技能复制一个节点,这样相当于这个点可以多走一次,正确性就有了。
接下来考虑怎样使 \(g\) 最小,本质上 \(g\) 只与每个点经过次数总和有关。不难发现,我们没有必要走回根节点,我们可以走到一个叶子节点然后直接终止。这实际上与 [CSP-S 模拟赛24 T3] 的思路已知,我们从直径一端点走,走到另一端点停止即可。这样就可以使 \(g\) 最小。
59 CSP-S 模拟赛42
模拟赛 38~41 只给高二考了。
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(50\) | \(100\) | \(39\) | \(35\) | \(224\) |
排名:rank \(2\)。
2 题解
T1 排列最小生成树
不难发现,如果我们顺此连接 \((i,i+1)\),每条边的边权都不超过 \(n\)。因此我们选择的点也会满足 \(|p_i-p_j|\times|i-j|<n\)。于是两者必有一个小于等于 \(\sqrt n\)。所以我们连边的数量就可以缩小到 \(O(n\sqrt n)\) 级别,此时再跑 Kruskal 就可以通过。
T2 卡牌游戏
考虑 \(a\) 中的每一位,实际上就是求模 \(\gcd\) 与该位置同余的位置上的 \(b\) 的和。这个操作就比较简单了,可以根号分治简单处理。
T3 比特跳跃
分三档考虑即可。
Part 1:
最简单的一档。不难发现,对于所有 \(i\in(2,n)\),无论如何都可以跳到与当前数无交集的数,也就是代价为 \(0\)。而对于 \(n\) 来说,除非 \(n=2^k-1\),否则与上面一致;而如果 \(n=2^k-1\),我们找到与 \(n\) 相连的边中最短的即可。
Part 2:
考虑两个数字不一样的位置,假如有 \(x_1,x_2,\cdots\) 不一样,那么我们走 \(a\to a\oplus 2^{x_1}\oplus 2^{x_2}\oplus \cdots\) 与走 \(a\to a\oplus 2^{x_1}\to a\oplus 2^{x_1}\oplus 2^{x_2}\to\cdots\) 的效果是一样的。因此实际上我们只需要每一次改变一个二进制位即可。这样边数就可以大大缩小。
Part 3:
首先有一个结论:每个数必须从自己的子集跳过来,否则一定不比从 \(1\) 跳过来优。那么我们先连上 \(1\) 到所有点的边,跑最短路。接下来对于每个点用子集最小值来更新 \(dis\),最后再跑一边最短路即可。
T4 区间
我们考虑离线处理。枚举 \(r\) 然后进行答案统计。
当我们新走到一个 \(r\) 的时候,需要找出一个最小的 \(l\),使得 \(\forall i\in[l,r],a_i<b_r\)。则此时对于这个 \(r\),所有可能的 \(l\) 就在这个区间中。
接下来我们需要找出这些 \(l\) 哪些还能被更新,也就是还没有在右边找到大于等于自己的数的数量。我们边走边用单调栈维护即可。剩下的就简单了,我们维护一颗线段树来表示每个 \(l\) 的答案,同时再维护该区间内的合法 \(l\) 数量。修改时直接区间加 \([l,r]\),有元素出栈时单点修改即可。
60 CSP-S 模拟赛43
1 得分
| 题目 | T1 | T2 | T3 | T4 | 总分 |
|---|---|---|---|---|---|
| 得分 | \(57\) | \(17\) | \(36\) | \(20\) | \(130\) |
排名:rank \(4\)。
2 题解
T1 Reverse
显然可以 BFS,而且由于边权都是 \(1\),所以每个点理论上只需要更新一次。考虑怎么保证每个点只被更新一次,可以维护两个 set 表示当前没有删除的奇数 / 偶数,这样复杂度就是 \(O(n\log n)\) 的了。
T2 Silhouette
先对两个数组排序。然后不难发现对于每一个 \(x_{i,j}\),其值不会大于 \(\min(a_i,b_j)\)。那么考虑枚举 \(s=\min(a_i,b_j)\),则满足 \(x_{i,j}\le s\) 的位置一定构成矩形或者 L 型。接下来利用二项式反演进行容斥,具体思路是只考虑行限制而不考虑列限制。
T3 Seat
这个题只能说是一码传三代,人走码还在。所以我们直接复制题解:
一个结论是,对于任意一个人,他坐下时离最近的人的距离是固定的,不随前面的人的决策而改变。这样我们可以将所有人按坐下时的距离分成若干层。另一个结论是,无论之前 每一层如何决策,轮到这一层时逬空区间的长度构成的可重集也是固定的。
对于最后一层特殊处理逬 接下来均默认不是最后一层。对于之前的每一层,考虑在哪些空 区间中央坐下可使得距离最大,其中可能会有一些长度为奇数的区间和一些长度为偶数的区间,而对于每个人来说,坐在任意一个奇数的区间的中央的概率都是相等的,偶数同理。
那么我们只需要知道,每个人有多大的概率坐在一个奇逯偶数区间的中央。考虑 dp,设 \(dp(i,j)\) 表示这一层已经坐下 \(i\) 个人之后,还有 \(j\) 个长度为偶数的区间的概率,转移只需考虑当前这个人坐了哪类区间即可。dp 之后容易算出之前要求的概率。
区间长度为奇数时位置是固定的;考虑区间长度为偶数的情况,此时会出现两个位置可供选择,但无论选择哪一个,都会将区间划分成长度为 \(\lfloor\frac n2\rfloor\) 和 \(\lfloor\frac n2\rfloor-1\) 的两段。因此这两种选择具有对称性,我们只需要假定选择其中的一个,算出这种情况下之后的层的答案,即可对称地 推出另一种情况下的答案。 瓶颈在利用对称性推答案的地方,复杂度为 \(O(n\log n)\)。
T4 万猪拱塔
非常玄学的题目:


浙公网安备 33010602011771号