zoukankan      html  css  js  c++  java
  • 【题解】[AGC036F] Square Constraints

    传送门

    给定 (n),求长为 (2n)(0)(2n-1) 的排列 (p) 的个数,满足 (n^2le i^2+p_i^2le 4n^2)(0le ile 2n-1)),(1le nle 250)


    这题调了我三天,基本被抬走了…… AC 的时候血压骤降。

    解析

    把题目中的条件转换成几何形式,即 ((i,p_i)) 在内半径为 (n),外半径 (2n) 的圆环内。如图给出了一个 (n=2)(p=left<2,3,0,1 ight>) 的例子:

    考虑没有内圆时的做法,即存在一个序列 (r_i),要求 (p) 满足 (r_ige p_i)。这是一个平凡的问题,即将 (r) 升序排序,第 (i) 位的选择数就是 (r_i+1-i)(每一位初始有 (r_i+1) 种选择,而有 (i) 种被占掉了,因为排序后之前的选择一定都被这一位包含),即答案就是 (prodlimits_{i=0}^{2n-1}(r_i+1-i))

    有内圆怎么做呢?设内圆产生的下界为 (l_i),先考虑将 ([l_ile xle r_i]) 类似的条件转换成 ([xle r_i]-[xle l_i-1]),接下来是一步经典的容斥转换:设 (f(k)) 为选 (k) 个数选择 (l_i) 为上界的方案数,则最终答案为:

    [sumlimits_{k=0}^n (-1)^kf(k) ]


    考虑 dp 求解 (f(k)),即令 (f_{i,j}) 为对于前 (i) 个数,选取 (j) 个以 (l_x) 为上界的方案数。注意到方案数的关键在于排序,即计算多少个数影响了该决策,即小于自身。

    (i<n) 时,以 (l_i) 为第一关键字,(r_i) 为第二关键字排序;当 (ige n) 时以 (r_i) 为关键字排序后,考虑以下转移(下文 (i) 代表原先下标,(i^prime) 代表排序后的下标):

    (ige n) 时,即不存在 (l_i),此时造成影响的有:

    • 小于自身的 (r_x),即 (x>i)(xge n),设有 (cnt_1) 个;
    • 可能选择的 (l_x),即 (j)

    这种转移的贡献是 ((r_i-cnt_1-j+1)f_{i^prime-1}{j})

    考虑 (i<n),此时有两种决策:

    1. 选择 (l_i) 为上界,则造成影响的有:
      • 满足 (r_x<l_i)(r_x),和前面相同,也是 (cnt_1) 种贡献;
      • 满足 (x>i)(l_x),注意此时的贡献数是 (j-1),因为已经钦定了一个位置选择 (l_x) 为上界。

    此时贡献是 ((l_i-cnt_1-j+2)f_{i^prime-1,j-1})(注意代码里还是 +1,因为下标不同)。

    1. 选择 (r_i) 为上界,类似的有:
      • 满足 (x>i)(r_x),注意这不仅包括了 (xge n)(n) 个贡献((r_i) 单调),还有满足 (i<x<n) 且取 (r_x) 的情况。则后者的贡献是总数 (n-1-i) 减去已经除去的 (j) 种,两类相加为 (2n-1-i-j)。(代码中用 lc 代替了后者贡献中的总数)
      • 满足 (l_x<r_i)(x),注意到这里有一个关键性质:所有的 (l_x) 都小于 (r_i),因为 (r_ige r_n=leftlfloorsqrt{3n^2} ight floorge sqrt{n^2}ge l_i)。所以这一部分的贡献与钦定的 (l_i) 总数有关,设其为 (k)

    此时贡献是 ((r_i-2n+i+j-k+2)f_{i^prime-1,j}),若用 (lc) 表示则为 ((r_i-lc-k+j+1)f_{i^prime-1,j})

    (f(k)=f_{2n, k}),最终整体统计答案即可。每次指定 (k) 进行 dp 复杂度 (mathcal{O}(n^2)),总共 (mathcal{O}(n^3)),可以通过。

    注意事项

    1. ([lle xle r]) 转换成 ([xle r] - [xle l-1]) 别忘了 -1;
    2. 循环边界,循环边界,循环边界!怎么强调都不为过!(f_{x,k}) 算了吗?(f(0)) 算了吗?
    3. dp 数组清空了吗?dp 初始值设了吗?
    4. dp 顺序的排序,注意关键字的顺序和大小关系。
    5. 有没有输出负数?

    Code

    本文来自博客园,作者 5ab,转载请注明链接哦 qwq

  • 相关阅读:
    Python处理时间 time && datetime 模块
    破解Mysql数据库密码
    JS一定要放在Body的最底部么?
    jQuery 层次选择器
    关于jquery中html()、text()、val()的区别
    解读JSP的解析过程
    JavaScript字符串分割方法
    maven install与maven package 的区别
    JSP起源、JSP的运行原理、JSP的执行过程
    Chrome隐身模式有什么用
  • 原文地址:https://www.cnblogs.com/5ab-juruo/p/solution_agc036f.html
Copyright © 2011-2022 走看看