Submission #52259

#TimeUsernameProblemLanguageResultExecution timeMemory
52259rondojimWall (IOI14_wall)C++17
32 / 100
921 ms153872 KiB
#include "wall.h" #include <bits/stdc++.h> #define pb push_back #define fr first #define sc second #define mk make_pair using namespace std; const int N = (int) 2e5 + 6; int nn; vector <pair<int,pair<int,int> > > add,cut; vector <int> mx,mn; struct node { int c,a; node () { c = 0,a = -1; } }t[N * 4],tt[N * 4]; void push (int v,int tl,int tr) { if (t[v].a != -1 && tl < tr) { if (t[v + v].a == -1) t[v + v].a = t[v].a; if (t[v + v + 1].a == -1) t[v + v + 1].a = t[v].a; t[v].a = -1; } } void update (int l,int r,int h,int v = 1,int tl = 0,int tr = nn - 1) { push(v,tl,tr); if (tl > r || tr < l || t[v].a != -1) return; if (l <= tl && tr <= r) { t[v].a = h; push(v,tl,tr); } else { int tm = (tl + tr) >> 1; update (l,r,h,v + v,tl,tm); update (l,r,h,v + v + 1,tm + 1,tr); push(v,tl,tr); push(v + v,tl,tm); push(v + v + 1,tm + 1,tr); } } void push1(int v,int tl,int tr) { if (tt[v].a != -1 && tl < tr) { if (tt[v + v].a == -1) tt[v + v].a = tt[v].a; if (tt[v + v + 1].a == -1) tt[v + v + 1].a = tt[v].a; tt[v].a = -1; } } void update1 (int l,int r,int h,int v = 1,int tl = 0,int tr = nn - 1) { push1(v,tl,tr); if (tl > r || tr < l || tt[v].a != -1) return; if (l <= tl && tr <= r) { tt[v].a = h; push1(v,tl,tr); } else { int tm = (tl + tr) >> 1; update1 (l,r,h,v + v,tl,tm); update1 (l,r,h,v + v + 1,tm + 1,tr); push1(v,tl,tr); push1(v + v,tl,tm); push1(v + v + 1,tm + 1,tr); } } void init (int v = 1,int tl = 0,int tr = nn - 1) { push(v,tl,tr); if (tl == tr) { mx.pb(t[v].a); } else { int tm = (tl + tr) >> 1; init(v + v,tl,tm); init(v + v + 1,tm + 1,tr); } } void init1 (int v = 1,int tl = 0,int tr = nn - 1) { push1(v,tl,tr); if (tl == tr) { mn.pb(tt[v].a); } else { int tm = (tl + tr) >> 1; init1(v + v,tl,tm); init1(v + v + 1,tm + 1,tr); } } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ nn = n; if (n <= 10000 && k <= 5000) { for (int i = 0; i < k; i ++) { int type = op[i]; int l = left[i]; int r = right[i]; int h = height[i]; if (type == 1) { for (int j = l; j <= r; j ++) finalHeight[j] = max(finalHeight[j],h); } else { for (int j = l; j <= r; j ++) finalHeight[j] = min(finalHeight[j],h); } } } else { for (int i = 0; i < k; i ++) { int type = op[i]; int l = left[i]; int r = right[i]; int h = height[i]; if (type == 1) add.pb({h,{l,r}}); else cut.pb({h,{l,r}}); } sort (add.rbegin(),add.rend()); sort (cut.begin(),cut.end()); for (auto to : add) update (to.sc.fr,to.sc.sc,to.fr); for (auto to : cut) update1 (to.sc.fr,to.sc.sc,to.fr); init(); init1(); for (int i = 0; i < nn; i ++) { finalHeight[i] = 0; if (mx[i] != -1) finalHeight[i] = mx[i]; if (mn[i] != -1) finalHeight[i] = min(mn[i],finalHeight[i]); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...