제출 #1250278

#제출 시각아이디문제언어결과실행 시간메모리
1250278susFountain (eJOI20_fountain)C++20
100 / 100
368 ms57328 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; vector<pair<int, int>> containers(n + 1); containers[0] = {1e9, 1e9}; for (int i = 1; i <= n; i++) { cin >> containers[i].first; cin >> containers[i].second; } vector<pair<int, int>> questions(q); for (int i = 0; i < q; i++) { cin >> questions[i].first; cin >> questions[i].second; } vector<pair<int, int>> containers_overflow; int max_pow = 30; vector<vector<pair<int, long long>>> jump(n + 1, vector<pair<int, long long>>(max_pow + 1)); containers_overflow.push_back({0, 1e9}); int current_container; for (int i = n; i >= 1; i--) { while (containers[i].first >= containers_overflow.back().second) { containers_overflow.pop_back(); } current_container = containers_overflow.back().first; jump[i][0] = {current_container, containers[current_container].second}; containers_overflow.push_back({i, containers[i].first}); } int where, capacity; for (int l = 1; l <= max_pow; l++) { for (int v = n; v >= 1; v--) { where = jump[jump[v][l - 1].first][l - 1].first; if (where == 0) { capacity = 1e9; } else { capacity = jump[v][l - 1].second + jump[jump[v][l - 1].first][l - 1].second; } jump[v][l] = {where, capacity}; } } int wasser; int start; for (int i = 0; i < q; i++) { start = questions[i].first; wasser = questions[i].second; wasser = max(wasser - containers[start].second, 0); for (int p = max_pow; p >= 0; p--) { if (jump[start][p].second <= wasser) { wasser -= jump[start][p].second; start = jump[start][p].first; } } if (wasser > 0) { start = jump[start][0].first; } cout << start << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...