如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

URAL/1523

来自"NOCOW"

跳转到: 导航, 搜索

树状数组就行,做k-1次传统逆序对即可。

#include <cstdio>
#include <cstring>
#define lowbit(x) ((x)&(-x))
typedef long long LL;
const LL p=1000000000LL;
int n,k,now=0,a[20001];
LL sum,ans=0,f[2][20001]={0},g[2][20001]={0};
void modify(int x,LL v)
{
    for (;x;x-=lowbit(x))
        f[now][x]=(f[now][x]+v)%p;
}
LL query(int x)
{
    for (sum=0;x<=n;x+=lowbit(x))
        sum=(sum+f[now][x])%p;
    return sum;
}
int main()
{
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;g[1][i++]=1)  scanf("%d",a+i);
    for (int i=2;i<=k;++i,now^=1)
    {
        memset(f[now],0,sizeof(f[now]));
        for (int j=i-1;j<=n;++j)
        {
            modify(a[j]-1,g[now^1][j]);
            g[now][j]=query(a[j]);
        }
    }
    for (int i=k;i<=n;++i)  ans=(ans+g[now^1][i])%p;
    printf("%I64d\n",ans);
    return 0;
}
//by zzy
<source>
个人工具