답안 #982004

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
982004 2024-05-13T17:55:20 Z dimashhh Skyscraper (JOI16_skyscraper) C++17
0 / 100
3 ms 3420 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e2 + 5, MOD = 1e9 + 7;

int n,l,a[N];
unordered_map<int,int> dp[N][N][2][2];
void add(int &x,int y){
    x += y;
    if(x >= MOD) x -= MOD;
}
void test(){
    cin >> n >> l;
    for(int i = 1;i <= n;i++) {
        cin >> a[i];
    }
    sort(a + 1,a + n + 1);
    if(n == 1) {
        cout << 1;
        return;
    }
    dp[1][1][0][0][-a[1] * 2] = 1;
    dp[1][1][0][1][-a[1]] = dp[1][1][1][0][-a[1]] = 1;
    for(int i = 1;i < n;i++){
        a[i] = a[i+1];
        for(int j = 1;j <= i;j++){
            for(int s = 0;s < 2;s++){
                for(int t = 0;t < 2;t++){
                    for(auto [k,d]:dp[i][j][s][t]){
                        if(k > l || k < -l) continue;
                        {//new
                            add(dp[i+1][j+1][s][t][k-a[i]*2],d*1ll*(j+1-s-t)%MOD);
                            if(!s){
                                add(dp[i+1][j+1][1][t][k-a[i]],d);
                            }
                            if(!t){
                                add(dp[i+1][j+1][s][1][k-a[i]],d);
                            }
                        }
                        {//merge
                            add(dp[i+1][j-1][s][t][k+a[i]*2],d*1ll*(j-1)%MOD);
                        }
                        {//corner
                            add(dp[i+1][j][s][t][k],d*1ll*(j*2-s-t)%MOD);
                            if(!s){
                                add(dp[i+1][j][1][t][k+a[i]],d);
                            }
                            if(!t){
                                add(dp[i+1][j][s][1][k+a[i]],d);
                            }
                        }
                    }
                }
            }
        }
        for(int j = 1;j <= i;j++){
            for(int s = 0;s < 2;s++){
                for(int t = 0;t < 2;t++){
                    dp[i][j][s][t].clear();
                }
            }
        }
    }
    int ans = 0;
    for(auto [x,y]:dp[n][1][1][1]){
        if(x <= l && x >= 0){
            add(ans,y);
        }
    }
    cout << ans;
}
int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);
    int T = 1;
//    cin >> T;
    while (T--){
        test();
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 2 ms 2660 KB Output is correct
4 Correct 1 ms 2908 KB Output is correct
5 Correct 1 ms 2908 KB Output is correct
6 Correct 3 ms 3164 KB Output is correct
7 Correct 2 ms 2908 KB Output is correct
8 Correct 1 ms 2908 KB Output is correct
9 Correct 3 ms 3416 KB Output is correct
10 Incorrect 1 ms 2908 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2904 KB Output is correct
2 Incorrect 3 ms 3420 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 2 ms 2660 KB Output is correct
4 Correct 1 ms 2908 KB Output is correct
5 Correct 1 ms 2908 KB Output is correct
6 Correct 3 ms 3164 KB Output is correct
7 Correct 2 ms 2908 KB Output is correct
8 Correct 1 ms 2908 KB Output is correct
9 Correct 3 ms 3416 KB Output is correct
10 Incorrect 1 ms 2908 KB Output isn't correct
11 Halted 0 ms 0 KB -