제출 #1208193

#제출 시각아이디문제언어결과실행 시간메모리
1208193kaltspielerhyFountain (eJOI20_fountain)C++20
100 / 100
258 ms48420 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define VIDE nbFontaines+1 const int INFINI = 1e17; struct fontaine { int taille, contenance; }; void dfs(int noeud, int parent, vector<vector<int>>& graphe, vector<vector<pair<int, int>>>& ancetres, vector<fontaine>& fontaines) { ancetres[noeud][0] = {parent, fontaines[noeud].contenance}; for (int iBit = 1; iBit < 18; iBit++) { ancetres[noeud][iBit].first = ancetres[ancetres[noeud][iBit-1].first][iBit-1].first; ancetres[noeud][iBit].second = ancetres[noeud][iBit-1].second + ancetres[ancetres[noeud][iBit-1].first][iBit-1].second; } for (int iVoisin : graphe[noeud]) { if (iVoisin != parent) { dfs(iVoisin, noeud, graphe, ancetres, fontaines); } } } signed main() { ios::sync_with_stdio(false); cin.tie(0); int nbFontaines, nbRequetes; cin >> nbFontaines >> nbRequetes; vector<fontaine> fontaines(nbFontaines); for (auto& it : fontaines) { cin >> it.taille >> it.contenance; } fontaines.push_back({INFINI, 0}); // pour ne pas déclencher define vector<vector<int>> graphe(nbFontaines+1); vector<pair<int, int>> monotone; monotone.push_back({0, fontaines[0].taille}); for (int i = 1; i <= nbFontaines; i++) { while (!monotone.empty() && monotone.back().second < fontaines[i].taille) { graphe[monotone.back().first].push_back(i); graphe[i].push_back(monotone.back().first); monotone.pop_back(); } monotone.push_back({i, fontaines[i].taille}); } while (!monotone.empty()) { graphe[monotone.back().first].push_back(nbFontaines); graphe[nbFontaines].push_back(monotone.back().first); monotone.pop_back(); } // nbFontaines+1 est une place vide vector<vector<pair<int, int>>> ancetres(nbFontaines+2, vector<pair<int, int>>(18, {VIDE, INFINI})); for (int i = 0; i < 18; i++) ancetres[VIDE][i] = {nbFontaines+1, 0}; dfs(nbFontaines, VIDE, graphe, ancetres, fontaines); for (int iRequete = 0; iRequete < nbRequetes; iRequete++) { int depart, capacite; cin >> depart >> capacite; depart--; int bitD = 17; while (bitD >= 0) { while (bitD >= 0 && (ancetres[depart][bitD].first == VIDE || ancetres[depart][bitD].second >= capacite)) { bitD--; } if (bitD < 0) break; capacite -= ancetres[depart][bitD].second; depart = ancetres[depart][bitD].first; bitD--; } cout << (depart+1)%(nbFontaines+1) << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...