2019牛客暑期多校训练营(第二场)

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
  • 从左到右枚举左端点,统计右边比当前值大的个数
  • 加个标记,标记左移,稳

posted @ 2019-07-20 18:13  FST_stay_night  阅读(1124)  评论(0编辑  收藏  举报