답안 #550397

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
550397 2022-04-18T04:02:16 Z farhan132 Boat (APIO16_boat) C++17
100 / 100
1588 ms 8500 KB
/***Farhan132***/
//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
//#pragma GCC optimization ("unroll-loops")
//#pragma GCC optimize("Ofast,fast-math")
 
 
#include <bits/stdc++.h>
 
 
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
typedef double dd;
typedef vector<ll> vll;
typedef pair<ll , ll> ii;
typedef vector< ii > vii;
typedef pair < pair < ll , ll > , pair < ll , ll > > cm; 
typedef tuple < ll,  ll, ll > tp;
 
#define ff first
#define ss second
#define pb push_back
#define in insert
#define f0(b) for(int i=0;i<(b);i++)
#define f00(b) for(int j=0;j<(b);j++)
#define f1(b) for(int i=1;i<=(b);i++)
#define f11(b) for(int j=1;j<=(b);j++)
#define f2(a,b) for(int i=(a);i<=(b);i++)
#define f22(a,b) for(int j=(a);j<=(b);j++)
#define sf(a) scanf("%lld",&a)
#define sff(a,b) scanf("%lld %lld", &a , &b)
#define pf(a) printf("%lld\n",a)
#define pff(a,b) printf("%lld %lld\n", a , b)
#define bug printf("**!\n")
#define mem(a , b) memset(a, b ,sizeof(a))
#define front_zero(n) __builtin_clzll(n)
#define back_zero(n) __builtin_ctzll(n)
#define total_one(n) __builtin_popcount(n)
#define clean fflush(stdout)
 
//const ll mod =  (ll) 998244353;
const ll mod =  (ll) 1e9 + 7;
const ll maxn = (ll)1e8 + 5;
const int nnn = 1048590;
const int inf = numeric_limits<int>::max()-1;
//const ll INF = numeric_limits<ll>::max()-1;
const ll INF = (ll)1e18;
 
ll dx[]={0,1,0,-1};
ll dy[]={1,0,-1,0};
ll dxx[]={0,1,0,-1,1,1,-1,-1};
ll dyy[]={1,0,-1,0,1,-1,1,-1};
 
bool USACO = 0;
 
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
 
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
 
template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

const ll N = 505;

ll fac[N], inv[N], num[N];

ll pw(ll a , ll b){
    ll res = 1;
    while(b){
        if(b&1) res = (res*a)%mod;
        a = (a*a)%mod;
        b /= 2;
    }
    return res;
}

void pre(ll n){
    fac[0] = 1;
    inv[0] = pw(fac[0], mod - 2);
    for(ll i = 1; i < n; i++){
        fac[i] = (fac[i-1] * i)%mod;
        inv[i] = pw(fac[i], mod - 2);
        num[i] = pw(i, mod - 2);
    }
    return;
}
 
ll nCr(ll n , ll r){
    if(n == r) return 1;
    if(n < r) return 0;
    ll ans = fac[n] * (inv[r]);
    ans %= mod;
    ans *= inv[n - r];
    return ans%mod;
}


ll dp[N][2*N];
ll combo[2*N][N];
ll a[N] , b[N];

void solve(){
  
  ll n; cin >> n;
  vector < ll > idx; idx.pb(0); idx.pb(1);
  for(ll i = 1; i <= n; i++){
    cin >> a[i] >> b[i];
    idx.pb(a[i]); idx.pb(b[i] + 1);
  }
  sort(idx.begin(), idx.end());
  idx.erase(unique(idx.begin(), idx.end()), idx.end());

  mem(dp, 0);
  ll sz = idx.size();

  for(ll i = 0; i < sz - 1; i++){
    ll len = idx[i + 1] - idx[i];
    for(ll j = 0; j <= n; j++){
       combo[i][j] = 0;
       ll res = 1, l = len;
       for(ll x = 1; x <= j; x++){
        res = (res * l)%mod; l--;
        res = (res * num[x])%mod;
        combo[i][j] += nCr(j - 1, x - 1) * res;
        combo[i][j] %= mod;
       }
    }
  }

  for(ll i = 0; i < sz; i++) dp[0][i] = 1;
  ll ans = 0;
  
  for(ll i = 1; i <= n; i++){
    a[i] = lower_bound(idx.begin(), idx.end(), a[i]) - idx.begin();
    b[i] = upper_bound(idx.begin(), idx.end(), b[i]) - idx.begin() - 1;
    dp[i][0] = 0;
    for(ll x = a[i]; x <= b[i]; x++){
        ll cnt = 1;
        ll len = idx[x + 1] - idx[x];
        for(ll j = i - 1; j >= 0; j--){
            dp[i][x] += combo[x][cnt] * dp[j][x - 1];
            dp[i][x] %= mod;
            if(a[j] <= x && b[j] >= x) cnt++;
        }
    }
    for(ll x = 1; x < sz; x++) dp[i][x] = (dp[i][x - 1] + dp[i][x])%mod;
    ans += dp[i][sz-1];
  }
  cout << ans%mod << '\n';


  return;
}
 
int main() {
    
    
    #ifdef LOCAL
        freopen("in", "r", stdin);
        freopen("out", "w", stdout);
        auto start_time = clock();
    #else 
       ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
    #endif
 
    pre(N);
 
    ll T = 1, CT = 0;  //cin >> T; 
 
    while(T--){
       //  cout << "Case #" << ++CT <<": " ;
        solve();
    }
    #ifdef LOCAL
        auto end_time = clock();
        cerr<< "Execution time: "<<(end_time - start_time)*(int)1e3/CLOCKS_PER_SEC<<" ms\n";
    #endif
 
    return 0;
}

Compilation message

boat.cpp: In function 'void solve()':
boat.cpp:143:12: warning: unused variable 'len' [-Wunused-variable]
  143 |         ll len = idx[x + 1] - idx[x];
      |            ^~~
boat.cpp: In function 'int main()':
boat.cpp:172:15: warning: unused variable 'CT' [-Wunused-variable]
  172 |     ll T = 1, CT = 0;  //cin >> T;
      |               ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 1300 ms 8340 KB Output is correct
2 Correct 1304 ms 8228 KB Output is correct
3 Correct 1298 ms 8348 KB Output is correct
4 Correct 1318 ms 8376 KB Output is correct
5 Correct 1361 ms 8420 KB Output is correct
6 Correct 1298 ms 8384 KB Output is correct
7 Correct 1325 ms 8380 KB Output is correct
8 Correct 1323 ms 8384 KB Output is correct
9 Correct 1334 ms 8348 KB Output is correct
10 Correct 1310 ms 8412 KB Output is correct
11 Correct 1298 ms 8228 KB Output is correct
12 Correct 1325 ms 8244 KB Output is correct
13 Correct 1355 ms 8396 KB Output is correct
14 Correct 1277 ms 8376 KB Output is correct
15 Correct 1337 ms 8240 KB Output is correct
16 Correct 233 ms 5084 KB Output is correct
17 Correct 262 ms 5064 KB Output is correct
18 Correct 237 ms 5016 KB Output is correct
19 Correct 254 ms 5216 KB Output is correct
20 Correct 246 ms 5004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1300 ms 8340 KB Output is correct
2 Correct 1304 ms 8228 KB Output is correct
3 Correct 1298 ms 8348 KB Output is correct
4 Correct 1318 ms 8376 KB Output is correct
5 Correct 1361 ms 8420 KB Output is correct
6 Correct 1298 ms 8384 KB Output is correct
7 Correct 1325 ms 8380 KB Output is correct
8 Correct 1323 ms 8384 KB Output is correct
9 Correct 1334 ms 8348 KB Output is correct
10 Correct 1310 ms 8412 KB Output is correct
11 Correct 1298 ms 8228 KB Output is correct
12 Correct 1325 ms 8244 KB Output is correct
13 Correct 1355 ms 8396 KB Output is correct
14 Correct 1277 ms 8376 KB Output is correct
15 Correct 1337 ms 8240 KB Output is correct
16 Correct 233 ms 5084 KB Output is correct
17 Correct 262 ms 5064 KB Output is correct
18 Correct 237 ms 5016 KB Output is correct
19 Correct 254 ms 5216 KB Output is correct
20 Correct 246 ms 5004 KB Output is correct
21 Correct 1393 ms 7952 KB Output is correct
22 Correct 1401 ms 8044 KB Output is correct
23 Correct 1352 ms 7992 KB Output is correct
24 Correct 1366 ms 8048 KB Output is correct
25 Correct 1365 ms 7820 KB Output is correct
26 Correct 1379 ms 7836 KB Output is correct
27 Correct 1426 ms 8072 KB Output is correct
28 Correct 1381 ms 7920 KB Output is correct
29 Correct 1367 ms 7852 KB Output is correct
30 Correct 1333 ms 8268 KB Output is correct
31 Correct 1320 ms 8304 KB Output is correct
32 Correct 1330 ms 8224 KB Output is correct
33 Correct 1288 ms 8284 KB Output is correct
34 Correct 1325 ms 8296 KB Output is correct
35 Correct 1315 ms 8228 KB Output is correct
36 Correct 1328 ms 8280 KB Output is correct
37 Correct 1350 ms 8372 KB Output is correct
38 Correct 1291 ms 8268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 5076 KB Output is correct
2 Correct 16 ms 5028 KB Output is correct
3 Correct 16 ms 5076 KB Output is correct
4 Correct 17 ms 5036 KB Output is correct
5 Correct 16 ms 5076 KB Output is correct
6 Correct 17 ms 5140 KB Output is correct
7 Correct 17 ms 5064 KB Output is correct
8 Correct 15 ms 5076 KB Output is correct
9 Correct 15 ms 5016 KB Output is correct
10 Correct 16 ms 5076 KB Output is correct
11 Correct 15 ms 5076 KB Output is correct
12 Correct 15 ms 5080 KB Output is correct
13 Correct 14 ms 5104 KB Output is correct
14 Correct 18 ms 5072 KB Output is correct
15 Correct 16 ms 5076 KB Output is correct
16 Correct 10 ms 4692 KB Output is correct
17 Correct 11 ms 4704 KB Output is correct
18 Correct 11 ms 4808 KB Output is correct
19 Correct 11 ms 4692 KB Output is correct
20 Correct 10 ms 4696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1300 ms 8340 KB Output is correct
2 Correct 1304 ms 8228 KB Output is correct
3 Correct 1298 ms 8348 KB Output is correct
4 Correct 1318 ms 8376 KB Output is correct
5 Correct 1361 ms 8420 KB Output is correct
6 Correct 1298 ms 8384 KB Output is correct
7 Correct 1325 ms 8380 KB Output is correct
8 Correct 1323 ms 8384 KB Output is correct
9 Correct 1334 ms 8348 KB Output is correct
10 Correct 1310 ms 8412 KB Output is correct
11 Correct 1298 ms 8228 KB Output is correct
12 Correct 1325 ms 8244 KB Output is correct
13 Correct 1355 ms 8396 KB Output is correct
14 Correct 1277 ms 8376 KB Output is correct
15 Correct 1337 ms 8240 KB Output is correct
16 Correct 233 ms 5084 KB Output is correct
17 Correct 262 ms 5064 KB Output is correct
18 Correct 237 ms 5016 KB Output is correct
19 Correct 254 ms 5216 KB Output is correct
20 Correct 246 ms 5004 KB Output is correct
21 Correct 1393 ms 7952 KB Output is correct
22 Correct 1401 ms 8044 KB Output is correct
23 Correct 1352 ms 7992 KB Output is correct
24 Correct 1366 ms 8048 KB Output is correct
25 Correct 1365 ms 7820 KB Output is correct
26 Correct 1379 ms 7836 KB Output is correct
27 Correct 1426 ms 8072 KB Output is correct
28 Correct 1381 ms 7920 KB Output is correct
29 Correct 1367 ms 7852 KB Output is correct
30 Correct 1333 ms 8268 KB Output is correct
31 Correct 1320 ms 8304 KB Output is correct
32 Correct 1330 ms 8224 KB Output is correct
33 Correct 1288 ms 8284 KB Output is correct
34 Correct 1325 ms 8296 KB Output is correct
35 Correct 1315 ms 8228 KB Output is correct
36 Correct 1328 ms 8280 KB Output is correct
37 Correct 1350 ms 8372 KB Output is correct
38 Correct 1291 ms 8268 KB Output is correct
39 Correct 14 ms 5076 KB Output is correct
40 Correct 16 ms 5028 KB Output is correct
41 Correct 16 ms 5076 KB Output is correct
42 Correct 17 ms 5036 KB Output is correct
43 Correct 16 ms 5076 KB Output is correct
44 Correct 17 ms 5140 KB Output is correct
45 Correct 17 ms 5064 KB Output is correct
46 Correct 15 ms 5076 KB Output is correct
47 Correct 15 ms 5016 KB Output is correct
48 Correct 16 ms 5076 KB Output is correct
49 Correct 15 ms 5076 KB Output is correct
50 Correct 15 ms 5080 KB Output is correct
51 Correct 14 ms 5104 KB Output is correct
52 Correct 18 ms 5072 KB Output is correct
53 Correct 16 ms 5076 KB Output is correct
54 Correct 10 ms 4692 KB Output is correct
55 Correct 11 ms 4704 KB Output is correct
56 Correct 11 ms 4808 KB Output is correct
57 Correct 11 ms 4692 KB Output is correct
58 Correct 10 ms 4696 KB Output is correct
59 Correct 1536 ms 8312 KB Output is correct
60 Correct 1522 ms 8308 KB Output is correct
61 Correct 1526 ms 8200 KB Output is correct
62 Correct 1522 ms 8432 KB Output is correct
63 Correct 1547 ms 8308 KB Output is correct
64 Correct 1588 ms 8296 KB Output is correct
65 Correct 1569 ms 8264 KB Output is correct
66 Correct 1518 ms 8308 KB Output is correct
67 Correct 1526 ms 8356 KB Output is correct
68 Correct 1537 ms 8336 KB Output is correct
69 Correct 1443 ms 8500 KB Output is correct
70 Correct 1403 ms 8416 KB Output is correct
71 Correct 1385 ms 8456 KB Output is correct
72 Correct 1386 ms 8392 KB Output is correct
73 Correct 1376 ms 8384 KB Output is correct
74 Correct 264 ms 5108 KB Output is correct
75 Correct 271 ms 5004 KB Output is correct
76 Correct 267 ms 5060 KB Output is correct
77 Correct 268 ms 5068 KB Output is correct
78 Correct 266 ms 5216 KB Output is correct