이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define debug(x) cerr << #x << " " << x << "\n"
#define debug_with_space(x) cerr << #x << " " << x << " "
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair <ll, ll> pii;
typedef pair <long double, pii> muchie;
typedef tree <ll, null_type, less_equal <ll>, rb_tree_tag, tree_order_statistics_node_update> OST;
const ll NMAX = 201;
const ll INF = (1LL << 60);
const ll MOD = 1000000007;
const ll BLOCK = 225;
const ll base = 31;
const ll nr_of_bits = 21;
ll dp[101][1001][101][2][2];
ll n, L;
ll v[101];
void add(ll &x, ll v) {
v = max(0LL, v);
x += v;
x %= MOD;
}
ll Compute(ll pz, ll score, ll components, ll st, ll dr) {
if(pz == n + 1) {
return (score <= L && components == 1 && st == 1 && dr == 1);
}
if(pz > 1)
score += (v[pz] - v[pz - 1]) * (2 * components - st - dr);
if(score > L)
return 0;
if(dp[pz][score][components][st][dr] != -1) {
return dp[pz][score][components][st][dr];
}
ll sol = 0;
///1. v[pz] il punem ca st
if(st != 1) {
//if(!(dr == 1 && components == 1)){
///propria componenta
add(sol, Compute(pz + 1, score, components + 1, 1, dr));
///la ce mai din stanga componenta
if(components > 0)
add(sol, Compute(pz + 1, score, components, 1, dr));
//}
}
if(dr != 1) {
//if(!(st == 1 && components == 1)) {
add(sol, Compute(pz + 1, score, components + 1, st, 1));
if(components > 0)
add(sol, Compute(pz + 1, score, components, st, 1));
// }
}
///o componenta noua
add(sol, (Compute(pz + 1, score, components + 1, st, dr) * (components + 1 - st - dr)) % MOD);
///alipim in stanga unei componente
if(components > 0)
add(sol, (Compute(pz + 1, score, components, st, dr) * (components - st)) % MOD);
///alipim in dreapta unei componente
if(components > 0)
add(sol, (Compute(pz + 1, score, components, st, dr) * (components - dr)) % MOD);
///mergeuim doua componente
if(components > 1)
add(sol, (Compute(pz + 1, score, components - 1, st, dr) * (components - 1)) % MOD);
return dp[pz][score][components][st][dr] = sol;
}
int main() {
//memset(dp, -1, sizeof(dp));
cin >> n >> L;
if(n == 1) {
cout << 1;
return 0;
}
for(int i = 1; i <= n; i++) {
cin >> v[i];
}
sort(v + 1, v + n + 1);
dp[0][0][0][0][0] = 1;
v[0] = v[1];
ll sol = 0;
for(int i = 1; i <= n; i++){
for(int score = 0; score <= L; score++){
for(int components = 1; components <= i; components++){
for(int st = 0; st <= 1; st++){
for(int dr = 0; dr <= 1; dr++){
if(st == 1){
///v[i] si-a deschis o noua comp care e stanga
ll inainte = score - ((v[i] - v[i - 1]) * ((components - 1) * 2 - dr));
if(inainte >= 0)
add(dp[i][score][components][st][dr], dp[i - 1][inainte][components - 1][0][dr]);
///se alipeste la cea mai din stanga si devine st
inainte = score - ((v[i] - v[i - 1]) * (components * 2 - dr));
if(inainte >= 0)
add(dp[i][score][components][st][dr], dp[i - 1][inainte][components][0][dr]);
}
if(dr == 1){
ll inainte = score - ((v[i] - v[i - 1]) * ((components - 1) * 2 - st));
if(inainte >= 0)
add(dp[i][score][components][st][dr], dp[i - 1][inainte][components - 1][st][0]);
inainte = score - ((v[i] - v[i - 1]) * (components * 2 - st));
if(inainte >= 0)
add(dp[i][score][components][st][dr], dp[i - 1][inainte][components][st][0]);
}
///deschide noua componenta
ll inainte = score - ((v[i] - v[i - 1]) * ((components - 1) * 2 - st - dr));
if(inainte >= 0)
add(dp[i][score][components][st][dr], (dp[i - 1][inainte][components - 1][st][dr] * (components - st - dr)) % MOD);
///se alipeste in stanga unei componente
inainte = score - ((v[i] - v[i - 1]) * (components * 2 - st - dr));
if(inainte >= 0)
add(dp[i][score][components][st][dr], (dp[i - 1][inainte][components][st][dr] * (components - st)) % MOD);
///se alipeste in dreapta unei componente
inainte = score - ((v[i] - v[i - 1]) * (components * 2 - st - dr));
if(inainte >= 0)
add(dp[i][score][components][st][dr], (dp[i - 1][inainte][components][st][dr] * (components - dr)) % MOD);
///mergeuieste doua componente
inainte = score - ((v[i] - v[i - 1]) * ((components + 1) * 2 - st - dr));
if(inainte >= 0)
add(dp[i][score][components][st][dr], (dp[i - 1][inainte][components + 1][st][dr] * components) % MOD);
if(i == n && st == 1 && dr == 1 && components == 1){
add(sol, dp[i][score][components][st][dr]);
}
}
}
}
}
}
cout << sol;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |