제출 #1183728

#제출 시각아이디문제언어결과실행 시간메모리
1183728GabrielFountain (eJOI20_fountain)C++20
100 / 100
408 ms58852 KiB
#include "bits/stdc++.h" using namespace std; struct Fuente{ long long Di_metro, Volumen; }; struct Ancestro{ long long Suma, Anterior; }; vector< vector<long long> > Grafo; vector<bool> Visitados; vector< vector<Ancestro> > Ancestrales; vector<Fuente> Fuentes; Fuente Nada; void DFS(long long Nodo){ Visitados[Nodo] = 1; long long EL_DE_ANTES = -2; for(auto E: Grafo[Nodo]){ EL_DE_ANTES = E; if(!Visitados[E]) DFS(E); } Ancestro Non; Nada.Di_metro = 0; Nada.Volumen = 0; if(EL_DE_ANTES == -2){ Ancestrales[Nodo].push_back(Non); Ancestrales[Nodo][0].Suma = Fuentes[Nodo].Volumen; Ancestrales[Nodo][0].Anterior = Nodo; } else { Ancestrales[Nodo].push_back(Non); Ancestrales[Nodo][0].Suma = Fuentes[Nodo].Volumen; Ancestrales[Nodo][0].Anterior = EL_DE_ANTES; long long Sumando = Fuentes[Nodo].Volumen; long long i = EL_DE_ANTES; for(long long j = 0; j < Ancestrales[i].size(); j++){ Sumando += Ancestrales[i][j].Suma; i = Ancestrales[i][j].Anterior; Ancestro Nuevo; Nuevo.Suma = Sumando; Nuevo.Anterior = i; Ancestrales[Nodo].push_back(Nuevo); } } } long long Consulta(long long f, long long v){ bool Primero = 1; while(1){ long long i; for(i = 0; i < Ancestrales[f].size(); i++){ if(Ancestrales[f][i].Suma >= v) break; } if(i == 0) return f; i--; v -= Ancestrales[f][i].Suma; f = Ancestrales[f][i].Anterior; } return f; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); Nada.Di_metro = 0; Nada.Volumen = 0; long long n, q; cin>>n>>q; Ancestrales.assign(n + 1, {}); Grafo.assign(n + 1, {}); Visitados.assign(n + 1, 0); Fuentes.assign(n + 1, Nada); Fuentes.back().Di_metro = 2222222222222222; Fuentes.back().Volumen = 2222222222222222; deque<long long> Cola1 = {2222222222222222}; deque<long long> Cola2 = {n}; for(long long i = 0; i < n; i++){ cin>>Fuentes[i].Di_metro>>Fuentes[i].Volumen; } for(long long i = n - 1; i > -1; i--){ long long Mejor = upper_bound(Cola1.begin(), Cola1.end(), Fuentes[i].Di_metro) - Cola1.begin(); long long Mayor = Cola1[Mejor], Quitar = -0; while(Cola1[0] < Mayor){ Cola1.pop_front(); Quitar++; } while(Quitar--){ Cola2.pop_front(); } Grafo[i].push_back(Cola2[0]); //cout<<i + 1<<" "<<Cola2[0] + 1<<"\n"; Cola1.push_front(Fuentes[i].Di_metro); Cola2.push_front(i); } for(long long i = 0; i <= n; i++){ if(!Visitados[i]) DFS(i); } /*for(long long i = 0; i <= n; i++){ cout<<i + 1<<" "; for(long long j = 0; j < Ancestrales[i].size(); j++) cout<<Ancestrales[i][j].Suma<<" "; cout<<"\n"; } cout<<"\n"; for(long long i = 0; i <= n; i++){ cout<<i + 1<<" "; for(long long j = 0; j < Ancestrales[i].size(); j++) cout<<Ancestrales[i][j].Anterior + 1<<" "; cout<<"\n"; } cout<<"\n";*/ while(q--){ long long f, v; cin>>f>>v; long long Respuesta = Consulta(f - 1, v); if(Respuesta == n) cout<<"0\n"; else cout<<Respuesta + 1<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...