1.[ICPC2018 WF]Gem Island
组合计数
题意
给定(n,d,r),求不定方程(sum_{i=1}^{n}x_i=d,x_ige 0)的一组解中前(r)大的值的和的期望。
(1leq n,dleq 500)
题解
如果仅仅是求解总方程的解数的话,即为(f(n,d)=inom{n+d-1}{d}).
我们换一个角度,从迭代的角度考虑方案数,我们每次选择(k)个数给它们多分一个,剩下可分的元素也都留给它们,相当于依据值的大小一层一层划分集合。
从这个角度来看,(f(n,d)=sum_{k}inom{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),洞有容量,洞可以不满。
(nleq 2.5 imes 10^5,sum y leq sum xleq 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}).
(nleq 2 imes 10^5)
题解
本题主要在于观察每类贡献如何计算,具体见博客.
4.[NEERC2016]Game on Graph
博弈论
题意
A 和 B 在玩一个有向图上的游戏。两人轮流操作,每次可以将棋子沿着其中一条边移动,不能移动者输。
你要对于每个点,分别求出以这个店为起点开始游戏,两人分别作为先手,最终会输,赢,还是平局(游戏无限循环)。
其中,A 更期望将游戏变为平局;B更期望游戏不要平局。当然,在不平局的基础上,两人都更希望赢。
(n,mleq 2 imes 10^5)
题解
首先判断一个点是否一定平局:
没有出度的点一定可以判断胜负,然后拓扑排序,若A能到的点中所有点均可以判断正负,他就得可以判断正负;若B能到的点中有一个点可以判断正负,他就能判断正负。此时没有遍历到的还上的点一定为平局。
然后对可以判断正负的点再拓扑一次,此时AB策略相同:若所有后继状态均另一人赢,则他必输;有一个状态另一人输,则他可赢。此时没有遍历到的环上的点一定为A赢B输(B宁愿输也不平局)。
5.[NWRRC2015]Graph
贪心
构造
题意
给定一张 有向无环图,你可以至多添加 (k) 条有向边,使得这仍然是一个有向无环图,使得字典序最小的拓扑序的字典序尽量大。
输出这个拓扑序以及方案。
(n,m,kle 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 ight}) 满足 $ 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} mod M)。
(nle 4000)
题解(待补)
本题涉及的前置知识较多,题做得差不多后再补题解。
8.[ICPC2016 WF]Longest Rivers
贪心
题意
题解
9.[CF24D]Broken robot
概率期望
高斯消元
带状矩阵
题意
(n)行 (m) 列的矩阵,现在在$ (i,j)$,每次等概率向左,右,下走或原地不动,但不能走出去,问走到最后一行期望的步数。
(n,mle 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
",f[a][b]);
return 0;
}
10.[CERC2015]Ice Igloos
计算几何
题意
给你(n)个圆,(m)条线段,求每条线段与多少圆相交。
(n,mleq 10^5,1leq x_i,y_i leq 500,0<r_i<1),各坐标均为整点
题解
可以说是平生第一道正式的计算几何题,
11.[ICPC2017 WF]Money for Nothing
分治
决策单调性
题意
坐标平面上有 (m) 个红点,(n) 个蓝点。你需要找到一个边平行于坐标轴的矩形,使得它以一个红点为左下角,蓝点为右上角,且面积最大。
(n,mleq 5 imes 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
题意
给定一个有向的树结构,需要安排选择节点的顺序,父子节点间有限制(父亲必须先选或者儿子必须先选),求方案数。
(nleq 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(未做)
扫描线