Submission #202274

#TimeUsernameProblemLanguageResultExecution timeMemory
202274SegtreeSkyscraper (JOI16_skyscraper)C++14
100 / 100
914 ms318712 KiB
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<unordered_set>
#include<unordered_map>
using namespace std;
typedef long long ll;
#define chmax(a,b) a=max(a,b)
#define chmin(a,b) a=min(a,b)
#define all(x) x.begin(),x.end()
#define rep(i,n) for(int i=0;i<n;i++)
#define mod 1000000007
#define mad(a,b) a=(a+b)%mod
ll n,L,a[110];
ll dp[110][2][2][110][1010];
ll dq[110][2][2][110];

void ad(ll i,ll l,ll r,ll c,ll cost,ll val){
    ll id=cost-dq[i][l][r][c];
    if(id<L){
	mad(dp[i][l][r][c][id],val);
    }
}
int main(){
    cin>>n>>L;
    rep(i,n)cin>>a[i];
    sort(a,a+n);
    
    if(n==1){
	cout<<1<<endl;
	return 0;
    }
    
    rep(i,n)rep(l,2)rep(r,2)rep(c,n)dq[i][l][r][c]=1e17;
    dq[0][0][0][1]=-2*a[0];
    dq[0][0][1][1]=-1*a[0];
    dq[0][1][0][1]=-1*a[0];
    rep(i,n-1)rep(l,2)rep(r,2)rep(c,n){
	if(l==1&&r==1&&c==1)continue;
	ll cost=dq[i][l][r][c];
	if(c+1>=1)chmin(dq[i+1][l][r][c+1],cost-2*a[i+1]);
	if(c+0>=1)chmin(dq[i+1][l][r][c+0],cost);
	if(c-1>=1)chmin(dq[i+1][l][r][c-1],cost+2*a[i+1]);
	if(l==0){
	    if(c+1>=1)chmin(dq[i+1][1][r][c+1],cost-a[i+1]);
	    if(c+0>=1)chmin(dq[i+1][1][r][c+0],cost+a[i+1]);
	}
	if(r==0){
	    if(c+1>=1)chmin(dq[i+1][l][1][c+1],cost-a[i+1]);
	    if(c+0>=1)chmin(dq[i+1][l][1][c+0],cost+a[i+1]);
	}
    }
    
    rep(i,n)rep(l,2)rep(r,2)rep(c,n)rep(cost,L)dp[i][l][r][c][cost]=0;
    dp[0][0][0][1][-2*a[0]-dq[0][0][0][1]]=1;
    dp[0][0][1][1][-1*a[0]-dq[0][0][1][1]]=1;
    dp[0][1][0][1][-1*a[0]-dq[0][1][0][1]]=1;
    rep(i,n-1)rep(l,2)rep(r,2)rep(c,n)rep(cosyo,L){
	if(l==1&&r==1&&c==1)continue;
	ll cost=dq[i][l][r][c]+cosyo;
	ll val=dp[i][l][r][c][cosyo];
	if(c+1>=1)ad(i+1,l,r,c+1,cost-2*a[i+1],val*(c+1-l-r));
	if(c+0>=1)ad(i+1,l,r,c+0,cost,val*(c*2-l-r));
	if(c-1>=1)ad(i+1,l,r,c-1,cost+2*a[i+1],val*(c-1));
	if(l==0){
	    if(c+1>=1)ad(i+1,1,r,c+1,cost-a[i+1],val);
	    if(c+0>=1)ad(i+1,1,r,c+0,cost+a[i+1],val);
	}
	if(r==0){
	    if(c+1>=1)ad(i+1,l,1,c+1,cost-a[i+1],val);
	    if(c+0>=1)ad(i+1,l,1,c+0,cost+a[i+1],val);
	}
    }
    ll ans=0;
    rep(cosyo,L){
	ll cost=dq[n-1][1][1][1]+cosyo;
	if(cost<=L)mad(ans,dp[n-1][1][1][1][cosyo]);
    }
    cout<<ans<<endl;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...