Submission #1346497

#TimeUsernameProblemLanguageResultExecution timeMemory
1346497StefanSebezSkyscraper (JOI16_skyscraper)C++20
100 / 100
609 ms167948 KiB
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
const int N=105,mod=1e9+7;
int n,L,a[N];
map<int,ll>dp[N][N][2][2];
int main(){
    scanf("%i%i",&n,&L);
    for(int i=1;i<=n;i++)scanf("%i",&a[i]);
    if(n==1){printf("1\n");return 0;}
    sort(a+1,a+n+1);
    dp[1][1][0][0][-2*a[1]]=1;
    dp[1][1][1][0][-a[1]]=1;
    dp[1][1][0][1][-a[1]]=1;
    for(int i=2;i<=n;i++){
        for(int j=0;j<=n;j++)for(int l=0;l<=1;l++)for(int r=0;r<=1;r++)for(auto [sum,x]:dp[i-1][j][l][r]){
            if(sum+(2*j-l-r)*a[i]>L)continue;
            dp[i][j][l][r][sum]+=(2*j-l-r)*x;
            if(!l)dp[i][j][1][r][sum+a[i]]+=x;
            if(!r)dp[i][j][l][1][sum+a[i]]+=x;

            dp[i][j+1][l][r][sum-2*a[i]]+=(j+1-l-r)*x;
            if(!l)dp[i][j+1][1][r][sum-a[i]]+=x;
            if(!r)dp[i][j+1][l][1][sum-a[i]]+=x;

            if(j>1)dp[i][j-1][l][r][sum+2*a[i]]+=(j-1)*x;
        }
        for(int j=0;j<=n;j++)for(int l=0;l<=1;l++)for(int r=0;r<=1;r++)for(auto &x:dp[i][j][l][r]){
            x.se%=mod;
        }
    }
    ll res=0;
    for(int l=L;l>=0;l--)res+=dp[n][1][1][1][l];
    res%=mod;
    printf("%lld\n",res);
    return 0;
}

Compilation message (stderr)

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:11:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |     scanf("%i%i",&n,&L);
      |     ~~~~~^~~~~~~~~~~~~~
skyscraper.cpp:12:31: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |     for(int i=1;i<=n;i++)scanf("%i",&a[i]);
      |                          ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...