省选测试38

A.选拔赛

既然\(a\)\(c\)的顺序不影响那先把a和c按从大到小排序

\(a\)组中前\(k\)大为\(A\)\(a\)组中后\(n-k\)\(B\)

一个很显然的思路是枚举\(A\)中最低分是几

但是发现不好做 所以转为枚举\(A\)中最低分最少是几的方案数

假定现在要求\(solve(L,R)\) 表示\(A\)组中的数大于等于\(L\)\(B\)组中的数小于等于\(R\)的方案数

那么\(A\)组中最低分是\(x\)的方案数显然可以是\(solve(x,x)-solve(x+1,x)\)

那考虑如何去求\(solve(x,x)\)

首先预处理出来两个数组\(y,z\)

\(y_i\)表示对于\(c_i\)这个数 有多少个A中的数满足\(a_j + c_i >= L\)

类似的

\(z_i\)表示对于\(c_i\)这个数 有多少个B中的数满足\(a_j + c_i <= R\)

既然a,c已经排序过了

那么一个很显然的事情是,\(y_i\)随着\(i\)的增加单调下降

\(z_i\)随着\(i\)的增加单调上升

另一个很好的性质是, \(y\)\(z\)虽然会变化, 但是小的永远只包含在大的里面

这时候考虑统计方案的方法, 显然正着做 每次选择可能会占用后面选择就很难做

所以考虑倒着统计方案,发现这样每次选择一定会占用前面的一个选择,就很可做了

最后通过这个可以列出一个dp,\(dp(i,j)\)表示共分配好了\(i\)\(c\),其中有\(j\)个给了A组

\(dp[i][j] = dp[i-1][j-1] * (y[i]-(K-j)) + dp[i-1][j] * (z[i]-(i-j-1))\)

dp转移的意思就是考虑第\(i\)\(c\)和哪组配对

如果和\(A\)组配对,因为它是第\(j\)个选的,所以按照倒着做的思想 后面已经占用了\(K-j\)个位置 当前位置有\(y[i]-(K-j))\)\(a\)可以配对

如果和\(B\)组配对,因为\(z\)是单调上升的,所以应该正着做, 此时前面已经占用了(i-j-1)个位置,当前位置有\(z[i]-(i-j-1)\)\(a\)可以配对

dp之后返回\(dp_{n,k}\)就是要求的方案数了




B.跳跃

考虑预处理出来\(L[p][k][i]\)表示\(i\)\(i+2^k-1\)位置跳\(p\)步的最左能到哪里

类似的\(R[p][k][i]\)表示\(i\)\(i+2^k-1\)位置跳\(p\)步最右能到哪里

首先\(L[0][0][i]\)\(R[0][0][i]\)是显然的

然后通过类似ST表可以得到\(L[0][k][i]\)\(R[0][k][i]\)

然后倍增的去求出\(L[p][k][i]\)\(R[p][k][i]\)

最后二分统计答案

考虑如何计算一个答案\(w\)是否合法

首先对于每个\(i\)求出其\(w\)步能跳到的左右端点\(tL[i],tR[i]\)

这个可以用二进制拆分和ST表实现

然后考虑一个点对\((x,y)\)合法的条件\(d(x,y) > w\)\(d(y,x) > w\)

那么这时\(w\)就是可行解

上面条件可以类似的转化为

\(L(x) > y\)\(R(y) < x\)

\(L(y) > x\)\(R(x) < y\)

这两者之一满足条件则点对合法

对于\(j < tL[i]\),我们要统计他们中的\(tR\)的最小值

对于\(j > tR[i]\) , 我们要统计他们中的\(tL\)的最大值

所以对\(tR\),\(tL\)分别做一个前缀最小值和后缀最大值就好了




C.切蛋糕

计算几何

维护一个vec表示此时有效的点,按极角序排序, 边就是相邻两个点

其中记录一个op表示它和前面的点的连线是直线还是弧线

每次加入一条边 先统计其与圆的两个交点

然后挨个去扫vec中的每个点,判断直线是否与该线有交,如果有交则记录下来

然后看该直线和此时有效的线的交点是否小于2,如果小于2显然不会切掉任何东西,直接继续就可以

如果等于2,表示切掉了一个区域

用刚刚记录的两个交点, 把两个交点中间的点都清掉,然后把这两个点加入

op根据实际情况判断 然后加入就可以

加入完再重新sort一遍 得到新的vec

最后统计答案只要按照op,把每个线的长度加到对应的ans上就可以

posted @ 2021-03-15 18:48  HISKrrr  阅读(50)  评论(0编辑  收藏  举报