首页 > 其他分享 >洛谷P2513 逆序对数列

洛谷P2513 逆序对数列

时间:2024-10-08 21:34:54浏览次数:1  
标签:排列 洛谷 int sum 个数 P2513 1005 逆序

Problem

给定n,k,求得1~n中有多少种排列使得逆序对个数为k?(n,k<=1000)

Solve

考虑DP:
设f[i][j]为i个数中逆序对数量为j的排列数量
但因为我们并不知道我们这i个数到底是谁,难以通过以前的状态得到
设f[i][j]为将i放入之前的排列后,逆序对数量为k的排列数
此时我们发现可以确定前i-1个数都选择了什么,且通过这种方式我们可以得到1~n的任意一种排列,所以此定义可行。
不难得出状态转移方程为:

\[f_{i,j}=\sum_{K=0}^{K<i}f_{i-1,j-K} \]

因为当前插入的i比前面的数都大,所以可以产生0~i-1个逆序对
但此时算法时间复杂度为\(O(n^3)\) 需要对每个i,j,k枚举,注意到我们每次是对\(f_{i-1,j-i+1}\)到\(f_{i-1,j}\)求和,所以这里每次把\(f_i\)求完之后用sum数组标记前缀和即可
其中解为\(f_{n,k}\),边界略
时间复杂度\(O(n^2)\)

Code(注意取模时可能会让答案变成负数)

#include<bits/stdc++.h>
using namespace std;
int n,k,f[1005][1005],sum[1005];
int main(){
    cin>>n>>k;
    f[1][0]=1;
    for(int i=0;i<=k;i++)sum[i]=1;
    for(int i=2;i<=n;i++){
        for(int j=0;j<=k;j++){
            if(i-1<j)
                f[i][j]=(10000+sum[j]-sum[j-i])%10000;
            else f[i][j]=sum[j];
            f[i][j]%=10000;
        }
        sum[0]=f[i][0];
        for(int j=1;j<=k;j++){
            sum[j]=sum[j-1]+f[i][j];
            sum[j]%=10000;
        }
    }
    cout<<f[n][k]%10000;
    return 0;
}

标签:排列,洛谷,int,sum,个数,P2513,1005,逆序
From: https://www.cnblogs.com/yiweixxs/p/18452536

相关文章

  • 【模板】回文自动机(PAM)(洛谷P5496)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();constexprllN=5e5+7;namespacePAM{intsize,tot,last;//last:最新插入的字母的编号......
  • SS241007B. 逆序对(inverse)
    SS241007B.逆序对(inverse)题意给你一个长度为\(n\)的排列,你可以选择一对\((i,j)\),交换\(p_i,p_j\),或者不操作,使减少的逆序对个数最多,求最多减少几个逆序对。思路首先考虑交换\(i,j\)会对哪些部分的逆序对数量产生影响。不难发现,如果我们画一个二维平面,上面有\(n\)个点......
  • 洛谷 P3523 题解
    洛谷P3523[POI2011]DYN-Dynamite分析二分答案,问题转化为:对于给定的\(K\),选择尽可能少的节点,使得所有关键节点都被「覆盖」。对于一个关键节点,「覆盖」的定义为:存在一个被选择的点与这个关键节点的距离不大于\(K\)。方便起见,我们指定\(1\)号节点是这棵树的根节点。我们......
  • 20241006每日一题洛谷P1031
    对题目第一印象:贪心吧,或者纯模拟第一次贪心,由于左右端堆只能想内一堆移动,遂放弃第一次模拟,开多个数组,(可能还要用递归?),遂放弃于是求助如来佛祖:从逻辑上可以看出,第一堆缺或者多的牌只能移动到第二堆上当第一堆达到期望值时,第一堆便不能再做操作,于是,可以将第二堆作为第一堆来处理......
  • 20241002每日一题洛谷P1563
    粗看题目我靠,什么方向还变来变去的(哭泣核心思想:圈内右数,圈外左数为整体逆时针数;圈外右数,圈内左数为整体顺时针数运用结构体就有了第一版源码:structpeople{ intface; charname[12];};intmain(){ intm,n; scanf("%d%d",&n,&m); peoplea[10010]; for(inti......
  • LOJ6077 逆序对
    lojcwoi题意求逆序对数恰为\(m\)的长度为\(n\)的排列数。\(n,m\le10^5\)。solution\(n,m\le5000\)首先对于更小的数据可以直接状压。进一步观察,发现我们并不需要知道值之间的具体大小,只用相对大小就能计算贡献了。于是设\(f_{i,j}\)表示长为\(i\),逆序对数为......
  • [题解][洛谷P3584] LAS
    题目描述有n个蛋糕和n个人,每个蛋糕的热量是Ci。第i个人可以选择吃第i或第i+1个蛋糕,第n个人可以选择吃第n或第1个蛋糕。若一个蛋糕被两个人吃,那么每个人得到的热量是Ci/2.若一个人改变自己的选择,得到的热量增加,那么他会不满意。试输出让所有人满意的解,输出每个人吃蛋糕的序号......
  • [题解][洛谷P1578] 奶牛浴场
    题目描述在长宽为L,W的二维平面上有n个障碍点,试找到一个不覆盖任何障碍点(但点可以在边缘线上的)面积最大的矩形(长宽均与坐标轴平行)。输出面积。题意分析n的范围在5e3,考虑O(n2)的做法。易得面积最大的矩形四条边要么有障碍点,要么覆盖的边界。否则四条边可以继续扩展,面积会变得更......
  • [题解][洛谷P1633] 二进制
    题目描述有三个整数A,B,C,构造三个整数X,Y,Z满足:1.A,B,C在二进制下1的数量分别与X,Y,Z相等;2.X,Y,Z在二进制下的长度不超过A,B,C的最大长度;3.X+Y=Z。输出Z的最小值,若不存在Z,输出-1。题意分析首先考虑X,Y在什么情况下会使1的数量发生改变。设x,y,z分别表示X,Y,Z中1的数量,则......
  • 洛谷P10336 [UESTCPC 2024] 2-聚类算法
    涉及知识点:博弈、贪心题意Alice和Bob在玩选点游戏,所有的点在一个\(k\)维空间中,他们轮流选走一个点放入自己的集合中,Alice先手。定义集合\(S\)的权值\(val(S)\)为集合中点两两之间的\(k\)维曼哈顿距离之和。Alice的得分为\(val(S_A)-val(S_B)\),Bob的得分为\(val(......