제출 #699585

#제출 시각아이디문제언어결과실행 시간메모리
699585Abrar_Al_SamitBoat (APIO16_boat)C++17
58 / 100
962 ms119144 KiB
#include<bits/stdc++.h> using namespace std; const int nax = 503; const int mod = 1e9 + 7; const int cax = 1e6 + 3; const long long sux = 1361; vector<int>ind[nax*2]; int a[nax], b[nax]; int n, m; int dp[nax*2][nax]; int inv[nax]; vector<int>imp; int add(int a, int b) { a += b; if(a>=mod) a -= mod; return a; } int mul(int a, int b) { return (a * 1LL * b) % mod; } int quickpow(int a, int b) { int ret = 1; while(b) { if(b&1) ret = mul(ret, a); a = mul(a, a); b >>= 1; } return ret; } int get(int x) { int &ret = inv[x]; if(ret==-1) { ret = quickpow(x, mod-2); } return ret; } vector<pair<long long,int>>table[cax]; int C(int n, int r) { long long H = n * sux + r; int H2 = H % cax; for(auto x : table[H2]) { if(x.first==H) return x.second; } int ret = 1; for(int i=n-r+1; i<=n; ++i) { ret = mul(ret, i); } for(int i=1; i<=r; ++i) { ret = mul(ret, get(i)); } table[H2].emplace_back(H, ret); assert((int)table[H2].size()<=3); return ret; } vector<pair<long long,int>>andp[cax]; int get(int len, int op) { long long H = len * sux + op; int H2 = H % cax; for(auto x : andp[H2]) { if(x.first==H) return x.second; } int ret = 0; for(int take=0; take<=min(op, len-1); ++take) { ret = add(ret, mul(C(op, take), C(len, take+1))); } andp[H2].emplace_back(H, ret); assert((int)andp[H2].size()<=3); return ret; } int solve(int i, int prv) { if(i==m-1) return prv>0; int &ret = dp[i][prv]; if(ret!=-1) return ret; ret = 0; ret = solve(i+1, prv); int len = imp[i+1]-imp[i]; for(int mx=0, cur_op=0; mx<ind[i].size(); ++mx) { if(ind[i][mx]<=prv) continue; int cur = mul(solve(i+1, ind[i][mx]), get(len, cur_op)); cur_op++; ret = add(ret, cur); } return ret; } void PlayGround() { cin>>n; set<int>pts; for(int i=1; i<=n; ++i) { cin>>a[i]>>b[i]; pts.insert(a[i]); pts.insert(b[i]+1); } for(int x : pts) { imp.push_back(x); } m = imp.size(); for(int i=0; i<m; ++i) { for(int j=1; j<=n; ++j) { if(imp[i]>=a[j] && imp[i]<=b[j]) { ind[i].push_back(j); } } } memset(inv, -1, sizeof inv); memset(dp, -1, sizeof dp); cout<<solve(0, 0)<<'\n'; // cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); PlayGround(); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

boat.cpp: In function 'int solve(int, int)':
boat.cpp:88:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |   for(int mx=0, cur_op=0; mx<ind[i].size(); ++mx) {
      |                           ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...