[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;
}
原文地址:https://www.cnblogs.com/xzz_233/p/cogs414.html