제출 #250713

#제출 시각아이디문제언어결과실행 시간메모리
250713alishahali1382Skyscraper (JOI16_skyscraper)C++14
100 / 100
70 ms35064 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("O2,unroll-loops") //#pragma GCC optimize("no-stack-protector,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<pii, int> piii; typedef pair<ll, ll> pll; #define debug(x) cerr<<#x<<'='<<(x)<<endl; #define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl; #define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl; #define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;} #define all(x) x.begin(), x.end() #define pb push_back #define kill(x) return cout<<x<<'\n', 0; const int inf=1000000010; const ll INF=10000000000000010LL; const int mod=1000000007; const int N=105, L=1005; int n, k, u, v, x, y, t, a, b; ll dp[N][N][3][L], ans; int A[N], B[N]; inline void fix(ll &x){ if (x>=mod) x-=mod; if (x<0) x+=mod; } int main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); cin>>n>>k; if (n==1) kill(1) for (int i=1; i<=n; i++) cin>>A[i]; sort(A+1, A+n+1, [](int i, int j){ return i>j; }); if (A[1]-A[n]>k) kill(0) for (int i=1; i<=n; i++) B[i]=A[i]-A[i+1]; dp[1][0][0][0]=1; dp[1][0][1][B[1]]=2; if (2*B[1]<=k) dp[1][0][2][2*B[1]]=1; for (int i=2; i<=n; i++){ for (int j=0; j<i; j++) for (int t:{0, 1, 2}){ for (int s=0; s<=k; s++) if (dp[i-1][j][t][s]){ // if (s<=6) cerr<<"i="<<i-1<<" j="<<j<<" t="<<t<<" s="<<s<<" "<<dp[i-1][j][t][s]<<"\n"; dp[i-1][j][t][s]%=mod; if (j){ dp[i][j+1][t][min(k+1, s+(2*j+t+2)*B[i])]+=j*dp[i-1][j][t][s]; dp[i][j][t][min(k+1, s+(2*j+t)*B[i])]+=2*j*dp[i-1][j][t][s]; dp[i][j-1][t][min(k+1, s+(2*j+t-2)*B[i])]+=j*dp[i-1][j][t][s]; } if (t){ dp[i][j+1][t][min(k+1, s+(2*j+t+2)*B[i])]+=t*dp[i-1][j][t][s]; dp[i][j][t][min(k+1, s+(2*j+t)*B[i])]+=t*dp[i-1][j][t][s]; dp[i][j+1][t-1][min(k+1, s+(2*j+t+1)*B[i])]+=t*dp[i-1][j][t][s]; dp[i][j][t-1][min(k+1, s+(2*j+t-1)*B[i])]+=t*dp[i-1][j][t][s]; } } } } for (int s=0; s<=k; s++) ans=(ans + dp[n][0][0][s])%mod; cout<<ans<<"\n"; // debug(dp[2][1][0][6]) // should be 0 return 0; } /* 4 10 9 6 3 2 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...