This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define MAX 105
int tab[MAX][MAX][1005][3];
bool existe[MAX][MAX][1005][3];
using ll = long long;
ll MOD = 1e9+7;
std::vector<int> alturas;
ll N,L;
ll dp(ll cur,ll conjs,ll soma,ll bordas){
if(soma>L)return 0;
if(cur==N){
if(conjs==1&&!bordas){
return 1;
}
return 0;
}
if(existe[cur][conjs][soma][bordas])return tab[cur][conjs][soma][bordas];
existe[cur][conjs][soma][bordas]=1;
ll num_lados = 2*conjs-(2-bordas);
ll custo=0;
if(cur){
custo=alturas[cur]-alturas[cur-1];
}
ll custo_adicional = custo*num_lados;
ll cur1 = 0,cur2=0,cur3=0;
///Une dois caras
if(conjs>1){
int remove=0;
if(bordas==1){
remove=conjs-1;
}else if(bordas==0){
remove=2*conjs-3;///Cuidado com uniao q acaba
if(conjs!=2)remove=2*conjs-2;
}
if(conjs!=2||bordas||(cur==N-1))
cur1 = (((conjs)*(conjs-1)-(remove))*dp(cur+1,conjs-1,soma+custo_adicional,bordas)) % MOD;
}
///Aumenta um cara
if(conjs>=1){
if(!bordas){///Jah escolheu ambas as bordas
cur2 = ((conjs*2-2)*dp(cur+1,conjs,soma+custo_adicional,bordas)) % MOD;
}else if(bordas==1){
///Nao marca borda
cur2 = ((conjs*2-1)*dp(cur+1,conjs,soma+custo_adicional,bordas)) % MOD;
///Marca borda
if(conjs>1){///Caso tenha mais de 2 caras
cur2 += ((conjs-1)*dp(cur+1,conjs,soma+custo_adicional,bordas-1)) % MOD;
}else if(cur==N-1&&conjs==1){///Caso seja o ultimo cara msm
cur2 += (dp(cur+1,conjs,soma+custo_adicional,bordas-1)) % MOD;
}
}else {
///Nao marca borda
cur2 = ((conjs*2)*dp(cur+1,conjs,soma+custo_adicional,bordas)) % MOD;
///Marca borda
if(bordas)
cur2 += ((2*conjs)*dp(cur+1,conjs,soma+custo_adicional,bordas-1)) % MOD;
}
}
///Cria um novo cara
{
///Ele nao eh fronteira
cur3 = dp(cur+1,conjs+1,soma+custo_adicional,bordas);
///Ele eh fronteira
if(bordas)
cur3 += (bordas)*dp(cur+1,conjs+1,soma+custo_adicional,bordas-1);
}
return tab[cur][conjs][soma][bordas] = (cur1+cur2+cur3)%MOD;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin>>N>>L;
if(N==1){
std::cout<<"1\n";
return 0;
}
for(int i=0;i!=N;++i){
int x;
std::cin>>x;
alturas.push_back(x);
}
std::sort(alturas.begin(),alturas.end());
std::cout<<dp(0,0,0,2)<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |