답안 #431972

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
431972 2021-06-17T17:51:16 Z MarcoMeijer Skyscraper (JOI16_skyscraper) C++14
100 / 100
422 ms 312968 KB
#include <bits/stdc++.h>
using namespace std;
 
// macros
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll, ll> lll;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<lll> vlll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define FOR(a,b) for(auto& a : b)
#define all(a) a.begin(), a.end()
#define INF 1e18
#define EPS 1e-9
#define pb push_back
#define popb pop_back
#define fi first
#define se second
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
 
// input
template<class T> void IN(T& x) {cin >> x;}
template<class H, class... T> void IN(H& h, T&... t) {IN(h); IN(t...); }
 
// output
template<class T1, class T2> void OUT(const pair<T1,T2>& x);
template<class T> void OUT(const vector<T>& x);
template<class T> void OUT(const T& x) {cout << x;}
template<class H, class... T> void OUT(const H& h, const T&... t) {OUT(h); OUT(t...); }
template<class T1, class T2> void OUT(const pair<T1,T2>& x) {OUT(x.fi,' ',x.se);}
template<class T> void OUT(const vector<T>& x) {RE(i,x.size()) OUT(i==0?"":" ",x[i]);}
template<class... T> void OUTL(const T&... t) {OUT(t..., "\n"); }
template<class H> void OUTLS(const H& h) {OUTL(h); }
template<class H, class... T> void OUTLS(const H& h, const T&... t) {OUT(h,' '); OUTLS(t...); }
 
// dp
template<class T> bool ckmin(T&a, T&b) { bool bl = a > b; a = min(a,b); return bl;}
template<class T> bool ckmax(T&a, T&b) { bool bl = a < b; a = max(a,b); return bl;}
 
void program();
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    program();
}
 

// mod library
ll MOD=1e9+7;

inline ll mod(ll x_) {
    return (x_)%MOD;
}
ll modpow(ll x_, ll N_) {
    if(N_ == 0) return 1;
    ll a = modpow(x_,N_/2);
    a = (a*a)%MOD;
    if(N_%2) a = (a*x_)%MOD;
    return a;
}
ll inv(ll x_) {
    return modpow(x_, MOD-2);
}
class mi {
public:
    mi(ll v=0) {value = v;}
    mi  operator+ (ll rs) {return mod(value+rs);}
    mi  operator- (ll rs) {return mod(value-rs+MOD);}
    mi  operator* (ll rs) {return mod(value*rs);}
    mi  operator/ (ll rs) {return mod(value*inv(rs));}
    mi& operator+=(ll rs) {*this = (*this)+rs; return *this;}
    mi& operator-=(ll rs) {*this = (*this)-rs; return *this;}
    mi& operator*=(ll rs) {*this = (*this)*rs; return *this;}
    mi& operator/=(ll rs) {*this = (*this)/rs; return *this;}
    operator ll&() {return value;}

    ll value;
};
typedef vector<mi> vmi;

//===================//
//   begin program   //
//===================//
 
const int MX = 110;
const int N = (1<<20);

int n, l, a[MX];
mi dp[MX][MX][MX*10][3];

void program() {
    IN(n,l);
    if(n == 1) return OUTL(1);
    RE1(i,n) IN(a[i]);
    sort(a+1,a+n+1);
    a[n+1] = 1e5;
    dp[0][0][0][0] = 1;
    RE1(i,n) { // first i buildings
        RE1(j,i) { // j components
            RE(k,l+1) { // total cost
                RE(m,3) { // m end points so far
                    int delta = (2*j - m)*(a[i+1]-a[i]);
                    if(delta > k || i + j + 1 - m > n) continue;

                    mi res = 0;

                    // create new component
                    res += dp[i-1][j-1][k - delta][m];

                    // create now component on endpoint
                    if(m) res += mi(3-m)*dp[i-1][j-1][k - delta][m-1];

                    // append to existing component
                    res += mi(2*j - m)*dp[i-1][j][k-delta][m];

                    // append to existing component on endpoint
                    if(m == 1) res += mi(2*j)*dp[i-1][j][k - delta][m-1];
                    if(m == 2) {
                        if(i == n) res += dp[i-1][j][k - delta][m-1];
                        else res += mi(j - 1)*dp[i-1][j][k - delta][m-1];
                    }

                    // join two existing components
                    if(m == 2) {
                        if(i == n) res += dp[i-1][j+1][k - delta][m];
                        else res += mi(j)*mi(j-1)*dp[i-1][j+1][k - delta][m];
                    }
                    else if(m == 1) res += mi(j)*mi(j)*dp[i-1][j+1][k - delta][m];
                    else res += mi(j)*mi(j+1)*dp[i-1][j+1][k - delta][m];

                    dp[i][j][k][m] = res;
                }
            }
        }
    }

    mi ans = 0;
    RE(k,l+1) ans += dp[n][1][k][2];
    OUTL(ll(ans));
}
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 312916 KB Output is correct
2 Correct 164 ms 312800 KB Output is correct
3 Correct 164 ms 312808 KB Output is correct
4 Correct 162 ms 312796 KB Output is correct
5 Correct 168 ms 312772 KB Output is correct
6 Correct 164 ms 312812 KB Output is correct
7 Correct 168 ms 312900 KB Output is correct
8 Correct 162 ms 312740 KB Output is correct
9 Correct 165 ms 312772 KB Output is correct
10 Correct 159 ms 312856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 312800 KB Output is correct
2 Correct 160 ms 312776 KB Output is correct
3 Correct 161 ms 312792 KB Output is correct
4 Correct 161 ms 312816 KB Output is correct
5 Correct 159 ms 312752 KB Output is correct
6 Correct 162 ms 312764 KB Output is correct
7 Correct 161 ms 312932 KB Output is correct
8 Correct 164 ms 312880 KB Output is correct
9 Correct 159 ms 312832 KB Output is correct
10 Correct 165 ms 312760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 312916 KB Output is correct
2 Correct 164 ms 312800 KB Output is correct
3 Correct 164 ms 312808 KB Output is correct
4 Correct 162 ms 312796 KB Output is correct
5 Correct 168 ms 312772 KB Output is correct
6 Correct 164 ms 312812 KB Output is correct
7 Correct 168 ms 312900 KB Output is correct
8 Correct 162 ms 312740 KB Output is correct
9 Correct 165 ms 312772 KB Output is correct
10 Correct 159 ms 312856 KB Output is correct
11 Correct 161 ms 312800 KB Output is correct
12 Correct 160 ms 312776 KB Output is correct
13 Correct 161 ms 312792 KB Output is correct
14 Correct 161 ms 312816 KB Output is correct
15 Correct 159 ms 312752 KB Output is correct
16 Correct 162 ms 312764 KB Output is correct
17 Correct 161 ms 312932 KB Output is correct
18 Correct 164 ms 312880 KB Output is correct
19 Correct 159 ms 312832 KB Output is correct
20 Correct 165 ms 312760 KB Output is correct
21 Correct 164 ms 312772 KB Output is correct
22 Correct 333 ms 312856 KB Output is correct
23 Correct 405 ms 312772 KB Output is correct
24 Correct 374 ms 312860 KB Output is correct
25 Correct 419 ms 312772 KB Output is correct
26 Correct 378 ms 312968 KB Output is correct
27 Correct 238 ms 312836 KB Output is correct
28 Correct 255 ms 312764 KB Output is correct
29 Correct 349 ms 312764 KB Output is correct
30 Correct 422 ms 312772 KB Output is correct