Submission #523047

#TimeUsernameProblemLanguageResultExecution timeMemory
523047Neacsu_MihaiTrampoline (info1cup20_trampoline)C++14
11 / 100
198 ms3424 KiB
#include <iostream> #include <fstream> #include <vector> #include <algorithm> #define YMAX 1e9 + 1 #define NMAX 200000 //doua sute cincizeci de mii #define LOG_LOWERBOUND 17 //e pt NMAX using namespace std; ifstream fin ("test.in"); ofstream fout ("test.out"); int R, C, N, T; int lg2[NMAX + 1]; pair <int, int> s[NMAX + 1]; int t[LOG_LOWERBOUND + 1][NMAX + 1]; int cautareBinara(int x, int y){ /* Imi returneaza, din lista de trambuline verzi, numarul celei de pe linia x, cu lowerboundul ei = y daca nu exista niciunul pe linia x, returneaza 0 */ int lo = 0; int hi = N + 1; int ans = 0; while(hi - lo > 1){ int mid = lo + (hi - lo) / 2; if(s[mid].first > x){ hi = mid; } else if(s[mid].first < x){ lo = mid; } else if(s[mid].second < y){ lo = mid; } else { ans = mid; hi = mid; } } return ans; } int stramos(int node, int nr){ if(nr == 0){ return s[node].second; } for(int i = lg2[nr]; i >= 0; i--){ if( (1 << i) <= nr ){ node = t[i][node]; nr -= (1 << i); } } ///daca node ajunge sa fie 0, inseamna ca nu exista al nr-lea stramos al lui node ///dar la mine trebuie sa existe ca sa zic 'Yes', ca altfel inseamna ca nu am destule trambuline pe drum ///adica inseamna ca nu am trambuline de la (xs, xf) destule ///si atunci vreau sa returnez ceva care sa ma faca sa afisez 'No', adica returnez un 'y' f mare, pentru ca eu urmeaza sa il compar cu yf if(node == 0){ return YMAX + 1; } return s[node].second; ///returneaza 'y'-ul celui de-al 'nr'-ulea stramos al lui 'node' } void computeLg2(){ lg2[1] = 0; for(int i = 2; i <= N; i++){ lg2[i] = lg2[i / 2] + 1; } } int main() { ios_base::sync_with_stdio(NULL); cin.tie(0); cout.tie(0); computeLg2(); cin >> R >> C >> N; ///globale for(int i = 1; i <= N; i++){ cin >> s[i].first >> s[i].second; } sort(s + 1, s + N + 1); for(int i = 1; i <= N; i++){ int aux = cautareBinara(s[i].first + 1, s[i].second); t[0][i] = aux; } for(int i = 1; i <= lg2[N]; i++){ for(int j = 1; j <= N; j++){ t[i][j] = t[i - 1][ t[i - 1][j] ]; } } cin >> T; ///global for(int Q = 1; Q <= T; Q++){ int xs, ys, xf, yf; cin >> xs >> ys >> xf >> yf; if(xf == xs){ ///caz special ca altfel am niste valori cu -1 si nu are sens if(ys <= yf){ cout << "Yes\n"; } else { cout << "No\n"; } } else if(xs > xf || ys > yf){ cout << "No\n"; } else { int st = cautareBinara(xs, ys); ///caut cel mai din stanga valid de pe linia 'xs' if(st == 0){ cout << "No\n"; } else if( stramos(st, xf - 1 - xs) <= yf ){ ///verific al 'xf - 1 - xs'-lea stramos al acestuia si verific daca e mai mic ca 'yf' cout << "Yes\n"; } else { cout << "No\n"; } } } return 0; }
#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...