Submission #381321

#TimeUsernameProblemLanguageResultExecution timeMemory
381321CSQ31Skyscraper (JOI16_skyscraper)C++14
100 / 100
426 ms320236 KiB
#pragma GCC optimize("Ofast") #include<bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second #define sz(a) (int)(a.size()) #define all(a) a.begin(),a.end() #define lb lower_bound #define ub upper_bound #define owo ios_base::sync_with_stdio(0);cin.tie(0); #define MOD (ll)(1e9+7) #define INF (ll)(1e18) #define debug(...) fprintf(stderr, __VA_ARGS__),fflush(stderr) #define time__(d) for(long blockTime = 0; (blockTime == 0 ? (blockTime=clock()) != 0 : false);\ debug("%s time : %.4fs\n", d, (double)(clock() - blockTime) / CLOCKS_PER_SEC)) typedef long long int ll; typedef long double ld; typedef pair<ll,ll> PII; typedef pair<int,int> pii; typedef vector<vector<int>> vii; typedef vector<vector<ll>> VII; typedef pair<int,pii> P; ll gcd(ll a,ll b){if(!b)return a;else return gcd(b,a%b);} ll dp[101][101][1001][2][2]; ll n,L; vector<ll>a; //go in reverse direction,treat dp states like a tree // 0,0,0,0,0 is the root ll solve(int i,int comp,int cur,int l,int r){ int ncur = cur; if(i)ncur+=(2*comp + l + r) * (a[i]-a[i-1]); if(ncur>L)return 0; if(comp < 0)return 0; if(dp[i][comp][cur][l][r] != -1)return dp[i][comp][cur][l][r]; if(i == n-1)return comp==0?1:0; ll res = 0; res+=solve(i+1,comp,ncur,1,r); res+=solve(i+1,comp-1,ncur,1,r) * comp; res+=solve(i+1,comp,ncur,l,1); res+=solve(i+1,comp-1,ncur,l,1) * comp; res+=solve(i+1,comp+1,ncur,l,r); res+=solve(i+1,comp,ncur,l,r) * comp * 2; res+=solve(i+1,comp-1,ncur,l,r) * (comp)*(comp-1); return dp[i][comp][cur][l][r] = res%MOD; } int main() { cin>>n>>L; a.resize(n); for(int i=0;i<n;i++)cin>>a[i]; sort(all(a)); memset(dp,-1,sizeof(dp)); cout<< solve(0,0,0,0,0); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...