杂题选讲(LCH) 5.6 题解
1.[ICPC2018 WF]Gem Island
组合计数
题意
给定\(n,d,r\),求不定方程\(\sum_{i=1}^{n}x_i=d,x_i\ge 0\)的一组解中前\(r\)大的值的和的期望。
\(1\leq n,d\leq 500\)
题解
如果仅仅是求解总方程的解数的话,即为\(f(n,d)=\binom{n+d-1}{d}\).
我们换一个角度,从迭代的角度考虑方案数,我们每次选择\(k\)个数给它们多分一个,剩下可分的元素也都留给它们,相当于依据值的大小一层一层划分集合。
从这个角度来看,\(f(n,d)=\sum_{k}\binom{n}{k}f(k,d-k)\).
设\(g(n,d)\)表示所有解的前\(r\)大的值之和,利用上面的角度可以得出递推式:
最后答案即为\(g(n,d)/f(n,d)+r\)(加\(r\)是原题的题目背景导致),时间复杂度\(O(n^2 d)\).
本题在模意义下还有一种时间复杂度更优的做法,
2.[ICPC2018 WF]Conquer The World
模拟费用流
题意
模拟费用流,树上老鼠进洞问题。
要求每个老鼠\(y\)必须要进一个洞\(x\),洞有容量,洞可以不满。
\(n\leq 2.5\times 10^5,\sum y \leq \sum x\leq 10^6\)
题解
第一次打模拟费用流的题目,当一道题的所求与网络流相同,但网络流明显会超时时,可以根据题目特点模拟费用流,本题推荐博客。
3.[CERC2015]Frightful Formula
组合计数
题意
已知\(f_{i,1}=l_i,f_{1,i}=t_i,f_{i,j}=af_{i,j-1}+bf_{i-1,j}+c\),求\(f_{n,n}\).
\(n\leq 2\times 10^5\)
题解
本题主要在于观察每类贡献如何计算,具体见博客.
4.[NEERC2016]Game on Graph
博弈论
题意
A 和 B 在玩一个有向图上的游戏。两人轮流操作,每次可以将棋子沿着其中一条边移动,不能移动者输。
你要对于每个点,分别求出以这个店为起点开始游戏,两人分别作为先手,最终会输,赢,还是平局(游戏无限循环)。
其中,A 更期望将游戏变为平局;B更期望游戏不要平局。当然,在不平局的基础上,两人都更希望赢。
\(n,m\leq 2\times 10^5\)
题解
首先判断一个点是否一定平局:
没有出度的点一定可以判断胜负,然后拓扑排序,若A能到的点中所有点均可以判断正负,他就得可以判断正负;若B能到的点中有一个点可以判断正负,他就能判断正负。此时没有遍历到的还上的点一定为平局。
然后对可以判断正负的点再拓扑一次,此时AB策略相同:若所有后继状态均另一人赢,则他必输;有一个状态另一人输,则他可赢。此时没有遍历到的环上的点一定为A赢B输(B宁愿输也不平局)。
5.[NWRRC2015]Graph
贪心
构造
题意
给定一张 有向无环图,你可以至多添加 \(k\) 条有向边,使得这仍然是一个有向无环图,使得字典序最小的拓扑序的字典序尽量大。
输出这个拓扑序以及方案。
\(n,m,k\le 10^5\)
题解
细节很难完全想清楚的一道构造题,题解。
备注:若最大堆为空或者最大堆中最大的节点编号小于当前节点,且当前拓扑序集合为空,为了防止出现环/为了防止由编号小的点连向编号大的点,不往最大堆中插入点。
6.[CERC2013]Escape
贪心
启发式合并
可并堆
题意
给定一棵大小为\(n\)的树,第一次进入每个节点时会增加或减少你的血量,初始血量为0,问血量不低于零的情况下能否从点\(1\)走到点\(t\)\(1≤n≤2*10^5,abs(点权)≤10^6\)
题解
这题感觉过题比较容易,但有些细节仍需思考。考虑用启发式合并/每个点维护若干个点对\((x,y)\)表示若花费\(x\)的代价可以获得\(y\)的血量,首先当前点的新点对的血量为正,之后在保证\(x\)不增大的前提下继续合并,对于\(t\),我们将其连向一个新节点,获得\(+inf\)的血量,以确保我们一定会选择走向\(t\).
7.[CERC2013]Captain Obvious and the Rabbit-Man
递推关系
题意
定义 Fibonacci 数 \(f_0 = 0, f_1 = 1, f_n = f_{n-1} + f_{n-2}\) (\(n \ge 1\)),有一个数列 \(\left\{ a_n \right\}\) 满足 $ a_n = c_1 \cdot f_2^n + c_2 \cdot f_3^n + \cdots + c_k \cdot f_{k+1}^n $ 其中 \(c_1, c_2, \cdots, c_k\) 为常数。
现在给定 \(a_1, a_2, \cdots, a_k\) 在 \(\hspace{-0.444em} \pmod M\) 时的值,你需要求出 \(a_{k+1} \bmod M\)。
\(n\le 4000\)
题解(待补)
本题涉及的前置知识较多,题做得差不多后再补题解。
8.[ICPC2016 WF]Longest Rivers
贪心
题意
题解
9.[CF24D]Broken robot
概率期望
高斯消元
带状矩阵
题意
\(n\)行 \(m\) 列的矩阵,现在在$ (i,j)$,每次等概率向左,右,下走或原地不动,但不能走出去,问走到最后一行期望的步数。
\(n,m\le 10^3\)
题解
转移方程易写出,但求解的话需要对带状矩阵进行高斯消元。
注意到这道题不要求写出模意义下的值,只要求求出近似值,这时候对于同一个状态反复转移不失为一个较好的策略。
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
double f[N][N],k[N];
int n,m,a,b;
int main(){
cin>>n>>m>>a>>b;
for(int i=1;i<=m;i++)k[i]=2+(i!=1)+(i!=m);
for(int i=n-1;i>=a;i--)
for(int t=0;t<100;t++)
for(int j=1;j<=m;j++)
f[i][j]=(f[i][j]+f[i][j+1]+f[i][j-1]+f[i+1][j])/k[j]+1;
printf("%.10lf\n",f[a][b]);
return 0;
}
10.[CERC2015]Ice Igloos
计算几何
题意
给你\(n\)个圆,\(m\)条线段,求每条线段与多少圆相交。
\(n,m\leq 10^5,1\leq x_i,y_i \leq 500,0<r_i<1\),各坐标均为整点
题解
可以说是平生第一道正式的计算几何题,
11.[ICPC2017 WF]Money for Nothing
分治
决策单调性
题意
坐标平面上有 \(m\) 个红点,\(n\) 个蓝点。你需要找到一个边平行于坐标轴的矩形,使得它以一个红点为左下角,蓝点为右上角,且面积最大。
\(n,m\leq 5\times 10^5,\)
题解
学到了新东西——利用分治法维护决策单调性,在本题中相比单调栈维护更易于码代码。
void divide(int l,int r,int nl,int nr){
if(l>r||nl>nr)return;
int mid=(l+r)>>1;
ll res=-1e18;int Mid=0;
for(int i=nl;i<=nr;i++)
if(a[mid].x<b[i].x||a[mid].y<b[i].y)
if(a[mid]*b[i]>res)res=a[mid]*b[i],Mid=i;
if(Mid){
divide(l,mid-1,nl,Mid);
divide(mid+1,r,Mid,nr);
ans=max(ans,res);
}
}
12.[HEOI2013]SAO
组合计数
树形DP
题意
给定一个有向的树结构,需要安排选择节点的顺序,父子节点间有限制(父亲必须先选或者儿子必须先选),求方案数。
\(n\leq 1000\)
题解(待补)
这道题在这篇博客提到的题中属于非常常规的一道题(这道题本身也不是杂题选讲的正式内容),或许THUSC后会自己码一份题解。
13.[NEERC2017]Knapsack Cryptosystem
阈值
Meet In the Middle
数论
题意
题解
学到的东西:
(1)按数据规模分类的思想
(2)Meet In the Middle算法
(3)同余式的除法
要注意:1<<64
未定义,未避免RE,需写为2<<63
14.[ICPC2017 WF]Son of Pipe Stream(未做)
网络流
人类智慧
题意
题解
15.[NWRRC2017]Fygon 2.0(未做)
状压DP
计数
题意
题解
16.[ICPC2014 WF]Pachinko(未做)
概率期望
高斯消元
带状矩阵
题意
题解
17.[CERC2015]Cow Confinement(未做)
扫描线