제출 #82589

#제출 시각아이디문제언어결과실행 시간메모리
82589luciocfSan (COCI17_san)C++14
120 / 120
251 ms3192 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 45; typedef long long ll; typedef pair<int, int> pii; int n; pii num[maxn], b[maxn]; vector<ll> v[maxn]; void compress(void) { map<int, int> M; vector<int> cc; for (int i = 0; i < n; i++) cc.push_back(num[i].first); sort(cc.begin(), cc.end()); int ind = 0; for (auto x: cc) if (M.find(x) == M.end()) M[x] = ++ind; for (int i = 0; i < n; i++) num[i].first = M[num[i].first]; } int main(void) { ios::sync_with_stdio(false); cin.tie(0); ll k; cin >> n >> k; for (int i = 0; i < n; i++) cin >> num[i].first >> num[i].second; compress(); int m = n/2; for (int i = m; i < n; i++) b[i-m] = num[i]; ll ans = 0LL; for (int mask = 1; mask < (1<<m); mask++) { int atual = 0; ll soma = 0LL; bool ok = 1; for (int i = 0; i < m; i++) { if (!(mask&(1<<i))) continue; if (num[i].first < atual) { ok = 0; break; } soma += (ll) num[i].second; atual = num[i].first; } if (ok) { if (soma >= k) ans++; v[atual].push_back(soma); } } for (int i = 1; i <= n; i++) sort(v[i].begin(), v[i].end()); int mm = n-m; for (int mask = 1; mask < (1<<mm); mask++) { int atual = 0, first = -1; ll soma = 0LL; bool ok = 1; for (int i = 0; i < mm; i++) { if (!(mask&(1<<i))) continue; if (b[i].first < atual) { ok = 0; break; } if (first == -1) first = b[i].first; soma += (ll) b[i].second; atual = b[i].first; } if (ok) { if (soma >= k) ans++; for (int i = 1; i <= first; i++) { vector<ll>::iterator it = lower_bound(v[i].begin(), v[i].end(), k-soma); ans += (ll)((int)(v[i].end()-it)); } } } cout << ans << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...