Submission #366549

#TimeUsernameProblemLanguageResultExecution timeMemory
366549BartolMSkyscraper (JOI16_skyscraper)C++17
100 / 100
332 ms123276 KiB
#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <int, pii> pip;
typedef pair <pii, int> ppi;
typedef pair <ll, ll> pll;

const int INF=0x3f3f3f3f;
const int N=102;
const int M=1005;
const int MOD=1e9+7;

int n, m;
int p[N];
int dp[N][N][M][3];

int mul(int a, int b) {
    return (ll)a*b%MOD;
}

int add(int a, int b) {
    a+=b;
    if (a>=MOD) a-=MOD;
    return a;
}

int rek(int i, int komp, int br, int kr) {
    if (komp<=0) return 0;
    if (kr>2) return 0;
    if (br>m) return 0;
    if (i==n) return komp==1 && kr==2;

    int &ret=dp[i][komp][br][kr];
    if (ret!=-1) return ret;
    ret=0;

    int raz=p[i]-p[i-1];
    int nekr=komp-kr;
    ///1. slucaj -> kraj dodajem
    if (i!=n-1) {
        ///dodajem novu komponentu kraj
        ret=add(ret, mul(rek(i+1, komp+1, br+nekr*2*raz+kr*raz, kr+1), 1+!kr));
        ///kraj mrgam na neku komponentu
        ret=add(ret, mul(rek(i+1, komp, br+(nekr-1)*2*raz+(kr+1)*raz+raz, kr+1), nekr*(1+!kr)));
    }
    else if (i==n-1 && komp==1 && kr==1) ret=add(ret, rek(i+1, komp, br+raz, kr+1));

    ///2. slucaj -> nova komponenta
    ret=add(ret, rek(i+1, komp+1, br+nekr*2*raz+kr*raz, kr));

    ///3. slucaj -> dodajem na neku komponentu
    ret=add(ret, mul( rek(i+1, komp, br+(nekr-1)*2*raz+kr*raz+2*raz, kr) , nekr*2));
    ret=add(ret, mul( rek(i+1, komp, br+nekr*2*raz+kr*raz, kr), kr) );

    ///4.slucaj -> spajanje dvije komponente
    ///nijedna nije kraj
    if (nekr>=2) ret=add(ret, mul( rek(i+1, komp-1, br+(nekr-1)*2*raz+2*raz+kr*raz, kr) , nekr*(nekr-1)));

    ///jedna je kraj
    if (nekr>=1 && kr) ret=add(ret, mul( rek(i+1, komp-1, br+(nekr-1)*2*raz+2*raz+kr*raz, kr) , kr*nekr));

    ///obe su kraj
    if (kr==2 && i==n-1) ret=add(ret, rek(i+1, komp-1, br+nekr*2*raz+2*raz, kr));


//    printf("pos: %d, raz: %d, br: %d, komp: %d, kr: %d === %d\n", i, raz, br, komp, kr, ret);

    return ret;


}

void load() {
    scanf("%d %d", &n, &m);
    for (int i=0; i<n; ++i) scanf("%d", &p[i]);
    sort(p, p+n);
}

int main() {
    load();

    if (n==1) {
        printf("1\n");
        return 0;
    }

    memset(dp, -1, sizeof dp);

    int sol=rek(1, 1, 0, 0);
    sol=add(sol, mul(rek(1, 1, 0, 1), 2));

    printf("%d\n", sol);
    return 0;
}

/**
3 7
2 3 6

4 10
3 6 2 9

5 10000
1 2 3 4 5
**/

Compilation message (stderr)

skyscraper.cpp: In function 'void load()':
skyscraper.cpp:81:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   81 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
skyscraper.cpp:82:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   82 |     for (int i=0; i<n; ++i) scanf("%d", &p[i]);
      |                             ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...