[APIO2016]划艇

Posted skylee的OI博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[APIO2016]划艇相关的知识,希望对你有一定的参考价值。

[APIO2016]划艇

思路:

参考这里

源代码:

#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
inline int getint() {
    register char ch;
    while(!isdigit(ch=getchar()));
    register int x=ch^'0';
    while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    return x;
}
typedef long long int64;
const int N=501,mod=1e9+7;
int a[N],b[N],f[N],C[N],inv[N];
std::vector<int> v;
int main() {
    const int n=getint();
    inv[1]=1;
    for(register int i=2;i<=n;i++) {
        inv[i]=(int64)(mod-mod/i)*inv[mod%i]%mod;
    }
    for(register int i=1;i<=n;i++) {
        v.push_back(a[i]=getint());
        v.push_back(b[i]=getint()+1);
    }
    std::sort(v.begin(),v.end());
    v.resize(std::unique(v.begin(),v.end())-v.begin());
    const int m=v.size();
    for(register int i=1;i<=n;i++) {
        a[i]=std::lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
        b[i]=std::lower_bound(v.begin(),v.end(),b[i])-v.begin()+1;
    }
    f[0]=C[0]=1;
    for(register int i=1;i<m;i++) {
        const int len=v[i]-v[i-1];
        for(register int i=1;i<=n;i++) {
            C[i]=(int64)C[i-1]*inv[i]%mod*(len+i-1)%mod;
        }
        for(register int j=n;j>=1;j--) {
            if(a[j]>i||b[j]<=i) continue;
            for(register int k=j,cnt=0;k>=1;k--) {
                if(a[k]<=i&&b[k]>i) cnt++;
                (f[j]+=(int64)f[k-1]*C[cnt]%mod)%=mod;
            }
        }
    }
    int ans=0;
    for(register int i=1;i<=n;i++) (ans+=f[i])%=mod;
    printf("%d
",ans);
    return 0;
}

以上是关于[APIO2016]划艇的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ4584][Apio2016]赛艇

BZOJ4584[Apio2016]赛艇 DP

计数难题5:[APIO2016]划艇

BZOJ 4584: [Apio2016]赛艇

#2567. 「APIO2016」划艇

UOJ#204 APIO2016Boat