zoukankan      html  css  js  c++  java
  • 「2017 山东一轮集训 Day7」逆序对

    题解:

    满满的套路题。。

    首先显然从大到小枚举

    然后每次生成的逆序对是1----(i-1)的

    这样做dp是nk的 复杂度太高了

    那我们转化一下问题

    变成sigma(ai   (ai<i)  )=k的方案数

    据说是个经典问题。。感觉非常奇妙

    先容斥一下,也就是说 总的-至少1个条件不满足+至少2个条件不满足

    那考虑一下如何算有x个条件不满足

    不满足这个条件就可以等价成ai>=i

    那么可以先将ai-i 那么就变成所有数的定义域都变成了自然数 那么方案数就是组合数了

    显然我们可以把x个条件-i的和相等的算在一起

    令f[i][j]表示在(0,1,2...n)中选i个数和为j的方案数

    其实在这里也就是 i个条件和为j

    那么这样答案就是先枚举i

    ans1=枚举j,f[i][j]*C();

    总ans=ans1*(-1)^i

    最后的问题就是如何计算f[i][j]

    第一次看见这种思路好像是上次zjoi讲课(这是生成不重复集合的经典做法)

    由于要保证这些自然数是不同的

    所以决策有两种

    1。将n-1个数先加1(保证不同)再插入一个1

    2。将这n个数都加1

    另外由于加的数有可能大于n,所以要减掉f[i-1][j-n-1] (因为这一次填入的一定是n+1,并且所有方案都有)

    gi=fi,j×(n+kj

  • 相关阅读:
    android-sdk环境变量配置
    2018/08/04
    python 读取配置文件ini ---ConfigParser
    关于自动化测试框架搭建的前期考虑问题
    Jmeter中用例禁用
    Jmeter创建一个http请求
    基本的sql语法
    sql创建表格时出现乱码
    Jmeter安装
    Java环境搭建
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8849821.html
Copyright © 2011-2022 走看看