zoukankan      html  css  js  c++  java
  • 省选测试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上就可以

    如初见 与初见
  • 相关阅读:
    poj 2187 Beauty Contest(旋转卡壳)
    poj 2540 Hotter Colder(极角计算半平面交)
    poj 1279 Art Gallery(利用极角计算半平面交)
    poj 3384 Feng Shui(半平面交的联机算法)
    poj 1151 Atlantis(矩形面积并)
    zoj 1659 Mobile Phone Coverage(矩形面积并)
    uva 10213 How Many Pieces of Land (欧拉公式计算多面体)
    uva 190 Circle Through Three Points(三点求外心)
    zoj 1280 Intersecting Lines(两直线交点)
    poj 1041 John's trip(欧拉回路)
  • 原文地址:https://www.cnblogs.com/HISKrrr/p/14539336.html
Copyright © 2011-2022 走看看