A. Eddy Walker
solved by rdc 202min -1
题意 一个点在长度为 \(n\) 的环上游走,输出第一次访问到所有点时在 \(x\) 上的概率。
做法 考虑经典的线段上随游走问题,数轴上有 \(x=0\) 的 \(A\) 点,与 \(x=n\) 的 \(B\) 点,那么位置为 \(i\) 的点被 \(B\) 吸附的概率为 \(\frac{i}{n}\),分两次考虑,先以 \(m-1\),\(m+1\) 为壁做随机游走,再以 \(m-1\ or\ m+1\) 和 \(m\) 为壁做随机游走。
B. Eddy Walker 2
solved by rdc 262min -1
题意 一个点在数轴上,每次往前随机跳 1 到 \(k\) 步。求能到达 \(x\) 的概率 \(p(x)\),以及 \(x\) 趋于正无穷时 \(p(x)\)。
做法
- 当 \(x\) 不为正无穷时,\(p(x)\) 可由线性递推得出,施展 BM。
- 否则,注意到跳 \(a\) 步,移动距离的期望为 \(\frac{(k+1)a}{2}\),因此 \[{\lim_{x \to +\infty}}p(x)=\frac{2}{k+1}\] (我觉得我在口胡)
C. Go on Strike!
D. Kth Minimum Clique
solved by F0_0H 230min -6
题意 给定一个带点权简单图,求点权和第\(k\)小的完全子图
题解
- 首先对n个点根据点权排序
- 考虑对于任意一个完全子图,可以再扩充的点一定为该完全子图每个点邻接点的交集
- 并且优先扩充点权更小的一定更优,所以可以选择按点权大小顺序扩充,这样还保证了不会重复
- 然后就可以用优先队列维护更新,每次实现一个扩充,并新加这个完全子图,再往后推一推,搞一搞就行了
- 维护临接点用bitset
TLE by rdc 二分上界,DFS 回溯找团,然后解体,二分受到了不公正的对待。
E. Maze
upsolved by sdcgvhgj
题意 n*m的格子,每次向下走或者左右走,不能回头,询问方案数,带修改。
做法 线段树套矩阵乘即可
F. Partition problem
solved by rdc 150min -3
题意 有 \(2n\) 个人,现需划分成两个等大的集合,一个无序 pair, \((x,y)\) 若,\(x,y\) 属于不同的集合,对答案的贡献为 \(v_{xy}\),求极大答案。
做法
- 进行折半枚举,划分成两个集合 \(L,R\)。
- 预处理 \(L,R\) 每个子集内部无序对权值和。\(O(2^nn)\)
- 预处理 \(R\) 中每个元素和 \(L\) 中每个子集权,无序对权值和 \(O(2^nn^2)\)
- 枚举 \(L\) 中,哪些人属于集合 A,哪些人属于集合 B,枚举 \(R\) 中哪些人属于集合 \(A\),\(O(C(2n,n)*n)\)
G. Polygons
upsolved by sdcgvhgj
题意 求n条直线把平面割成的若干多边形
做法
- 共\(n^2\)个交点,多边形最多有\(n^2\)个
- 相邻的两交点之间相互连两条边,
- 从一个点开始每次沿顺时针夹角最小的一条边移动,并删除这条边,直到走回这个点,所经过的点形成一个多边形
- 三分eps即可(笑)
H. Second Large Rectangle
solved by rdc 93min -2
题意 给一个01矩阵,求次大全为1的子矩阵大小。
做法
- 求极大子矩阵,预处理每个位置向上能连续延伸多少个 1,枚举下界,单调栈带走,记录次大的答案。
- 把最大子矩阵去掉一行,或者去掉一列,尝试更新答案。
I. Inside A Rectangle
J. Subarray
solved by F0_0H 107min -3
题意 长度为\(1e9\)的\((1, -1)\)序列,下标从\(0\)到\(1e9-1\),已知有\(n\)个区间为\(1\),其他为\(-1\), 问存在多少个区间的和\(>1\)(保证\(\sum_{1\leq i\leq n}r[i]-l[i]+1\leq 1e7\))
题解
- 可能作为区间端点的点个数最多为\(3e7\)
- \(f[i]\)表示以第\(i\)个区间右端点为答案右端点的最大区间和
- \(g[i]\)表示以第\(i\)个区间左端点为答案左端点的最大区间和
- \(f[i] = max(0, f[i-1]-(l[i]-r[i-1]-1))+r[i]-l[i]+1\)
- \(g[i] = max(0, g[i+1]-(l[i+1]-r[i]-1))+r[i]-l[i]+1\)
- 如果\(f[i] + g[i+1] \geq l[i+1] - r[i] - 1\),说明答案的左右端点可以跨越\([r[i]+1, l[i+1]-1]\),那么把这些合并考虑
- 搞完上面,问题就变成了给你一个长度不超过\(3e7\)的\((1,-1)\)序列,问有多少区间和大于1
- 树状数组时间\(O(n*logn)\),稳\(T\)
- 考虑优化:
- 很好用的性质:每次查询与上次查询的差距等于1
- 从左到右枚举左端点,统计右边比当前值大的个数
- 加个标记,标记左移,稳