Submission #230790

#TimeUsernameProblemLanguageResultExecution timeMemory
230790cheissmartWall (IOI14_wall)C++14
100 / 100
742 ms62224 KiB
#include "wall.h" #include <bits/stdc++.h> #define F first #define S second #define MP make_pair #define PB push_back #define EB emplace_back #define ALL(v) (v).beign(), (v).end() #define debug(x) cerr << #x << " is " << x << endl using namespace std; typedef long long ll; typedef pair<int, int> pi; typedef vector<int> vi; const int N = 2000006, INF = 1e9 + 7; struct S { int ub, lb; } t[N * 4]; void init(int v, int tl, int tr) { t[v].ub = INF; t[v].lb = 0; if(tr - tl == 1) return; int tm = (tl + tr) / 2; init(v*2, tl, tm); init(v*2+1, tm, tr); } void put_tag(int v, int op, int h) { if(op == 1) { // lb t[v].lb = max(t[v].lb, h); if(t[v].lb >= t[v].ub) t[v].ub = t[v].lb; } else { // rb t[v].ub = min(t[v].ub, h); if(t[v].lb >= t[v].ub) t[v].lb = t[v].ub; } } void push(int v) { put_tag(v*2, 1, t[v].lb); put_tag(v*2, 2, t[v].ub); put_tag(v*2+1, 1, t[v].lb); put_tag(v*2+1, 2, t[v].ub); t[v].lb = 0, t[v].ub = INF; } void upd(int l, int r, int op, int h, int v, int tl, int tr) { if(l >= r) return; if(l == tl && r == tr) { put_tag(v, op, h); return; } push(v); int tm = (tl + tr) / 2; upd(l, min(r, tm), op, h, v*2, tl, tm); upd(max(l, tm), r, op, h, v*2+1, tm, tr); } void build_ans(int v, int tl, int tr, int* ans) { if(tr - tl == 1) { ans[tl] = t[v].lb; return; } push(v); int tm = (tl + tr) / 2; build_ans(v*2, tl, tm, ans); build_ans(v*2 + 1, tm, tr, ans); } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ init(1, 0, n); for(int i = 0; i < k;i++) { upd(left[i], right[i] + 1, op[i], height[i], 1, 0, n); } build_ans(1, 0, n, finalHeight); 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...