Submission #400402

#TimeUsernameProblemLanguageResultExecution timeMemory
400402OzyPlahte (COCI17_plahte)C++17
160 / 160
251 ms37676 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for (int i = (a); i <= (b); i++) #define repa(i,a,b) for (int i = (a); i >= (b); i--) #define lli long long int struct cua{ lli x1; lli y1; lli x2; lli y2; }; cua cuadros[80002]; lli n,m,a,b,c,d,cont,ult,k; lli padres[19][80002]; set<lli> colores[80002]; lli res[80002]; struct eve { lli x; lli arriba; lli abajo;// color lli tipo; lli id; bool operator < (const eve &a) const { if (x != a.x) return x < a.x; else return tipo < a.tipo; } }; set<pair <lli, lli> > activos; eve eventos[240002]; eve act; lli contenido(lli y) { auto par = (*activos.lower_bound({y, 0})); lli pas = par.second; if (cuadros[pas].y1 <= y) return pas; else{ lli ult = 0; repa(i,18,0) { if (padres[i][pas] == 0) continue; if (cuadros[ padres[i][pas] ].y1 <= y) ult = padres[i][pas]; else pas = padres[i][pas]; } return ult; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> m; cont = 1; rep(i,1,n) { cin >> a >> b >> c >> d; cuadros[i] = {a,b,c,d}; eventos[cont++] = {a,d,b,1,i}; eventos[cont++] = {c,d,b,3,i}; } rep(i,1,m) { cin >> a >> b >> c; eventos[cont++] = {a,b,c,2,i+n}; } sort(eventos+1, eventos+cont); k = cont; rep(T,1,k-1) { act = eventos[T]; if (act.tipo == 1) { ult = contenido(act.arriba); padres[0][act.id] = ult; cont = 0; while (ult > 0){ padres[cont+1][act.id] = padres[cont][ult]; ult = padres[cont][ult]; cont++; } activos.insert({act.arriba, act.id}); } else if (act.tipo == 2) { ult = contenido(act.arriba); if (ult == 0) continue; if (colores[ult].find(act.abajo) == colores[ult].end()) colores[ult].insert(act.abajo); } else { res[act.id] = colores[act.id].size(); ult = padres[0][act.id]; if (ult) { if (colores[ult].size() < colores[act.id].size()) swap(colores[ult], colores[act.id]); for (auto pos : colores[act.id]) { if (colores[ult].find(pos) == colores[ult].end()) colores[ult].insert(pos); } } colores[act.id].clear(); activos.erase({act.arriba, act.id}); } } rep(i,1,n) cout << res[i] << "\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...