제출 #1243485

#제출 시각아이디문제언어결과실행 시간메모리
1243485BuiDucManh123Skyscraper (JOI16_skyscraper)C++20
15 / 100
1 ms840 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pb push_back
#define taskname ""
#define ld long double
const int mod = 1e9+7;
using namespace std;
#define int ll
int a[109], dp[109][109][1009][5];
signed main() {
    if (fopen(taskname".inp","r")) {
        freopen(taskname".inp","r",stdin);
        freopen(taskname".out","w",stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n, l;
    cin >> n >> l;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    a[n + 1] = 2000;
    dp[0][0][0][0] = 1;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= i; j++){
            for(int k = 1; k <= l; k++){
                for(int m = 0; m < 3; m++){
                    if(j - m + 1 > n - i) continue;
                    int diff = (a[i + 1] - a[i]) * (2 * j - m);
                    if(diff > k) continue;

                    dp[i][j][k][m] = (dp[i][j][k][m] + dp[i - 1][j - 1][k - diff][m]) % mod;
                    if(m == 1){
                        dp[i][j][k][m] = (dp[i][j][k][m] + 2 * dp[i - 1][j - 1][k - diff][m - 1]) % mod;
                    }
                    if(m == 2){
                        dp[i][j][k][m] = (dp[i][j][k][m] + dp[i - 1][j - 1][k - diff][m - 1]) % mod;
                    }

                    dp[i][j][k][m] = (dp[i][j][k][m] + (2 * j - m) * dp[i - 1][j][k - diff][m] % mod) % mod;
                    if(m == 1){
                        dp[i][j][k][m] = (dp[i][j][k][m] + 2 * j * dp[i - 1][j][k - diff][m - 1] % mod) % mod;
                    }
                    if(m == 2){
                        if(i == n){
                            dp[i][j][k][m] = (dp[i][j][k][m] + dp[i - 1][j][k - diff][m - 1]) % mod;
                        }else{
                            if(j > 1){
                                dp[i][j][k][m] = (dp[i][j][k][m] + (j - 1) * dp[i - 1][j][k - diff][m - 1] % mod) % mod;
                            }
                        }
                    }

                    if(m == 2){
                        if(i == n){
                            dp[i][j][k][m] = (dp[i][j][k][m] + dp[i - 1][j + 1][k - diff][m]) % mod;
                        }else{
                            dp[i][j][k][m] = (dp[i][j][k][m] + j * (j - 1) % mod * dp[i - 1][j + 1][k - diff][m] % mod) % mod;
                        }
                    }
                    if(m == 1){
                        dp[i][j][k][m] = (dp[i][j][k][m] + j * j % mod * dp[i - 1][j + 1][k - diff][m] % mod) % mod;
                    }
                    if(m == 0){
                        dp[i][j][k][m] = (dp[i][j][k][m] + j * (j + 1) % mod * dp[i - 1][j + 1][k - diff][m] % mod) % mod;
                    }
                }
            }
        }
    }
    int ans = 0;
    for(int k = 1; k <= l; k++){
        ans = (ans + dp[n][1][k][2]) % mod;
    }
    cout << ans;
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:17:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |         freopen(taskname".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
skyscraper.cpp:18:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |         freopen(taskname".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...