Submission #295068

#TimeUsernameProblemLanguageResultExecution timeMemory
295068arayiWall (IOI14_wall)C++17
100 / 100
1294 ms262144 KiB
#include <bits/stdc++.h> #include "wall.h" #define MP make_pair #define ad push_back #define fr first #define sc second using namespace std; const int N = 2e6 + 30; const int n1 = 1e5; int nn; vector <pair<int, int> > fp[N], fp1[N], ff[N], ff1[N]; bool col[N]; priority_queue <int> h[n1 + 20], h1[n1 + 20]; int t1[4 * n1]; void upd1(int q, int l = 0, int r = n1, int nd = 1) { if(q > r || q < l) return; if(l == r) { if(h1[l].empty()) t1[nd] = 0; else t1[nd] = h1[l].top(); return; } int mid = (l + r) / 2; upd1(q, l, mid, nd * 2); upd1(q, mid + 1, r, nd * 2 + 1); t1[nd] = max(t1[nd * 2], t1[nd * 2 + 1]); } int t[4 * n1]; void upd(int q, int l = 0, int r = n1, int nd = 1) { if(q > r || q < l) return; if(l == r) { if(h[l].empty()) t[nd] = 0; else t[nd] = h[l].top(); return; } int mid = (l + r) / 2; upd(q, l, mid, nd * 2); upd(q, mid + 1, r, nd * 2 + 1); t[nd] = max(t[nd * 2], t[nd * 2 + 1]); } int qry(int l = 0, int r = n1, int nd = 1, int a = 0, int b = 0) { if(l == r) return l; int mid = (l + r) / 2; if(max(a, t1[nd * 2]) < max(b, t[nd * 2 + 1])) return qry(mid + 1, r, nd * 2 + 1, max(a, t1[nd * 2]), b); else return qry(l, mid, nd * 2, a, max(b, t[nd * 2 + 1])); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { nn = n; for (int i = 0; i < k; i++) { if(op[i] == 1) fp[left[i]].ad(MP(height[i], i + 1)), ff[right[i] + 1].ad(MP(height[i], i + 1)); else fp1[left[i]].ad(MP(height[i], i + 1)), ff1[right[i] + 1].ad(MP(height[i], i + 1)); } for (int i = 0; i < nn; i++) { for(auto p : fp[i]) { h[p.fr].push(p.sc); upd(p.fr); } for(auto p : fp1[i]) { h1[p.fr].push(p.sc); upd1(p.fr); } for(auto p : ff[i]) { col[p.sc] = 1; while(!h[p.fr].empty() && col[h[p.fr].top()]) h[p.fr].pop(); upd(p.fr); } for(auto p : ff1[i]) { col[p.sc] = 1; while(!h1[p.fr].empty() && col[h1[p.fr].top()]) h1[p.fr].pop(); upd1(p.fr); } finalHeight[i] = qry(); } return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...