牛客OI周賽15-普及組 B 三角形+D 多元組 DP

~~刪除線格式~~
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

B:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
 
int a[105][105];
LL f[105][10005];
int main(){
    int n, k, m; scanf("%d%d", &n, &k);
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i][0]);
        for(int j=1; j<=a[i][0]; j++){
            scanf("%d", &a[i][j]);
        }
    }
    f[0][0]=1;
    for(int i=1; i<=n; i++){
        for(int s=0; s<=10000; s++){
            if(f[i-1][s]){
                for(int j=1; j<=a[i][0]; j++){
                    f[i][s+a[i][j]]+=f[i-1][s];
                }
            }
        }
    }
    LL ans=0;
    for(int i=1; i<=10000; i++){
        if(f[n][i]<k){
            ans+=f[n][i]*i;
            k-=f[n][i];
        }
        else{
            ans+=k*i;
            k=0;
            break;
        }
    }
    cout<<ans<<endl;
 
    return 0;
}

D:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int mod=1e9+7;
 
struct BitTree
{
    LL c[100005];
    int lowbit(int p){
        return (p&-p);
    }
    void Add(int x, LL v)
    {
        if (!x)
            return;
        while (x < 100005)
            c[x] = (c[x]+v)%mod, x += lowbit(x);
    }
    LL Ask(int x)
    {
        LL t = 0;
        while (x)
            t += c[x], t%=mod, x -= lowbit(x);
        return t;
    }
 
}bit[51];
 
int a[100005], b[100005];
int main(){
    int n, m; scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
        b[i]=a[i];
    }
    sort(b+1, b+n+1);
    int cnt=unique(b+1, b+n+1)-b-1;
    for(int i=1; i<=n; i++){
        a[i]=lower_bound(b+1, b+cnt+1, a[i])-b;
    }
    for(int i=1; i<=n; i++){
        for(int len=1; len<=m; len++){
            if(len==1){
                bit[1].Add(a[i], 1);
            }
            else{
                bit[len].Add(a[i], bit[len-1].Ask(a[i]-1));
            }
        }
    }
    printf("%lld\n", bit[m].Ask(100004));
 
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章