zoukankan      html  css  js  c++  java
  • [HAOI2009]逆序对数列

    [HAOI2009]逆序对数列


    竟然自己想出来了(O(n^3))做法= =
    设f[i][j]为i个数的排列逆序对为j的数列个数。
    枚举数i在哪里,i的贡献就是i后面的数的个数。
    (f[i][j]=sum_{l=i-j+1}^{j} f[i-1][l])
    为什么下面的不行了呢,因为i的贡献最多i-1
    然后加个前缀和优化秒此题

    // It is made by XZZ
    #include<cstdio>
    #include<algorithm>
    #define Fname "permut"
    using namespace std;
    #define rep(a,b,c) for(rg int a=b;a<=c;a++)
    #define drep(a,b,c) for(rg int a=b;a>=c;a--)
    #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
    #define il inline
    #define rg register
    #define vd void
    #define mod 10000
    typedef long long ll;
    il int gi(){
        rg int x=0;rg bool flg=0;rg char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')flg=1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return flg?-x:x;
    }
    int f[1010][1010];
    int main(){
        freopen(Fname".in","r",stdin);
        freopen(Fname".out","w",stdout);
        int n=gi(),k=gi();
        f[1][0]=1;
        rep(i,2,n)rep(j,0,k){
    	f[i][j]=(f[i-1][j]+f[i][j-1])%mod;
    	if(j>=i)f[i][j]+=mod-f[i-1][j-i],f[i][j]%=mod;
        }
        printf("%d
    ",f[n][k]);
        return 0;
    }
    
  • 相关阅读:
    用户场景描述
    构建之法阅读笔记03
    冲刺记录(4.26)
    力扣-dp基础问题思维构建
    力扣-二叉树专题
    力扣-巧妙哈希
    力扣-双指针问题
    力扣-区间问题
    力扣-单调栈与单调队列问题
    力扣-股票买卖专题
  • 原文地址:https://www.cnblogs.com/xzz_233/p/cogs414.html
Copyright © 2011-2022 走看看