Submission #1295911

#TimeUsernameProblemLanguageResultExecution timeMemory
1295911trinm01Skyscraper (JOI16_skyscraper)C++20
100 / 100
180 ms127884 KiB
// #pragma GCC optimize("O3")
// #pragma GCC optimization("Ofast,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;

#define int long long 
#define ll long long
#define FOR(i, l, r) for (int i = (l); i <= (r); i++)
#define FOD(i, r, l) for (int i = (r); i >= (l); i--)
#define fi first
#define se second
#define pii pair<int, int>

const ll mod = 1e9 + 7;
const int MAXN = 1e2 + 5;
const ll oo = 1e18 + 7;  
const int base = 10;

int n, L, a[MAXN];
int f[MAXN][MAXN][1005][3];

signed main()
{
    ios_base::sync_with_stdio(false);	
    cin.tie(NULL);
    
    
    // freopen("test.txt", "r", stdin);
    // freopen("o2.out", "w", stdout);

    if(fopen(".inp", "r")){
        freopen(".inp", "r", stdin);
        freopen(".out", "w", stdout);
    }

    cin >> n >> L;
    FOR(i, 1, n){
    	cin >> a[i];
    }
    if(n==1){
    	cout << 1;
    	return 0;
    }
    sort(a+1, a+1+n);
    
    a[n+1]=1e10;
    f[0][0][0][0]=1;
    FOR(i, 1, n){
    	FOR(j, 1, n){
    		FOR(k, 0, L){
    			FOR(m, 0, 2){
    				int d=(2*j-m)*(a[i+1]-a[i]);
    				if(k-d<0) continue;
    				// if(i+j+1-m>n) continue;
    				
    				int ans=0;
    				
    				// cout << i-1 << ' ' << j-1 << ' ' << k-d << ' ' << m << '\n';
    				ans+=f[i-1][j-1][k-d][m];
    				
    				if(m>0){
    					ans+=(3-m)*f[i-1][j-1][k-d][m-1];
    				}
    				
    				ans+=(2*j-m)*f[i-1][j][k-d][m];
    				
    				if(m==1){
    					ans+=2*j*f[i-1][j][k-d][m-1];
    				}
    				else if(m==2){
    					if(i==n){
    						ans+=f[i-1][j][k-d][m-1];
    					}
    					else{
    						ans+=(j-1)*f[i-1][j][k-d][m-1];
    					}
    				}
    				
    				if(m==2){
    					if(i==n){
    						ans+=f[i-1][j+1][k-d][m];	
    					}
    					else{
    						ans+=j*(j-1)*f[i-1][j+1][k-d][m];
    					}
    				}
    				else if(m==1){
    					ans+=j*j*f[i-1][j+1][k-d][m];    					
    				}
    				else{
    					ans+=j*(j+1)*f[i-1][j+1][k-d][m];
    				}
    				
    				ans%=mod;
    				f[i][j][k][m]=ans;
    			}
    		}
    	}
    }
    
    int ans=0;
    FOR(k, 0, L){
    	ans+=f[n][1][k][2];
    }
    ans%=mod;
    
    cout << ans;
    return 0;
}

Compilation message (stderr)

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