比赛 2026.5.16 评测结果 AAAAAAAAAA
题目名称 Divide 最终得分 100
用户昵称 终焉折枝 运行时间 0.228 s
代码语言 C++ 内存使用 25.11 MiB
提交时间 2026-05-16 11:21:13
显示代码纯文本
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 2005;
const int M = 1e9 + 7;

struct node{
    int mx, ans;
}f[N][N];
// f[i][j] 表示已经处理了 前 i 个元素,把 j 划分为 A 队的 {mx, ans}  
int n, m;
int w[N];
int id[N];

bool check(int x){
    return (id[1] + id[x]) >= m;
}

int main(){
    freopen("divide.in", "r", stdin);
    freopen("divide.out", "w", stdout);
    cin.tie(0) -> ios::sync_with_stdio(0);
    cin >> n >> m;
    for(int i = 1;i <= n;i ++){
        cin >> w[i];
    }
    sort(w + 1, w + n + 1);
    int l = 1, r = n;
    int p = n;
    while(l < r){
        if(w[l] + w[r] >= m) id[p --] = w[r --];
        else id[p --] = w[l ++];
    }
    id[p --] = w[l];
//    for(int i = 1;i <= n;i ++){
//        cout << id[i] << '\n';
//    }
    for(int i = 0;i <= n;i ++){
        for(int j = 0;j <= n;j ++){
            f[i][j].mx = -1e9;
            f[i][j].ans = 0;
        }
    }
    f[1][0] = {0, 1};
    f[1][1] = {0, 1};
    for(int i = 2;i <= n;i ++){
        for(int j = 0;j <= i;j ++){
            if(check(i)){
                node lst = f[i - 1][j];
                lst.mx += j;
                if(f[i][j].mx < lst.mx) f[i][j] = lst;
                else if(f[i][j].mx == lst.mx) f[i][j].ans = (f[i][j].ans + lst.ans) % M;
                if(j){
                    node lst = f[i - 1][j - 1];
                    lst.mx += ((i - 1) - (j - 1));
                    if(f[i][j].mx < lst.mx) f[i][j] = lst;
                    else if(f[i][j].mx == lst.mx) f[i][j].ans = (f[i][j].ans + lst.ans) % M;
                }
            }
            else{
                if(f[i][j].mx < f[i - 1][j].mx) f[i][j] = f[i - 1][j];
                else if(f[i][j].mx == f[i - 1][j].mx) f[i][j].ans = (f[i][j].ans + f[i - 1][j].ans) % M;
                if(j){
                    if(f[i][j].mx < f[i - 1][j - 1].mx) f[i][j] = f[i - 1][j - 1];
                    else if(f[i][j].mx == f[i - 1][j - 1].mx) f[i][j].ans = (f[i][j].ans + f[i - 1][j - 1].ans) % M;
                }
            }
        }
    }
    node ANS = {0, 0};
    for(int j = 0;j <= n;j ++){
        if(ANS.mx < f[n][j].mx) ANS = f[n][j];
        else if(ANS.mx == f[n][j].mx) ANS.ans = (ANS.ans + f[n][j].ans) % M;
    }
    cout << ANS.mx << ' ' << ANS.ans << '\n';
    return 0;
}