Submission #219217

#TimeUsernameProblemLanguageResultExecution timeMemory
219217summitweiWall (IOI14_wall)C++17
100 / 100
942 ms177800 KiB
#include <bits/stdc++.h> #include <wall.h> using namespace std; typedef vector<int> vi; typedef vector<pair<int, int> > vpii; typedef pair<int, int> pii; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<double, double> pdd; typedef vector<ll> vll; #define INF 0x3f3f3f3f #define MOD 1000000009LL #define EPSILON 0.00001 #define f first #define s second #define pb push_back #define mp make_pair #define FOR(i, a, b) for (ll i=(a); i<=(signed)(b); i++) #define F0R(i, a) for (ll i=0; i<(signed)(a); i++) #define RFOR(i, a, b) for (ll i=(a); i >= b; i--) #define MN 2000005 struct Node{ int l, r; int lzl, lzr; Node() : l(-INF), r(INF), lzl(-INF), lzr(INF) {} }; void push(Node *a, int lr, int rr){ if(a->l < lr) a->l = lr; if(a->l > rr) a->l = rr; if(a->r < lr) a->r = lr; if(a->r > rr) a->r = rr; } void add(Node *a, int lr, int rr){ if(a->lzl < lr) a->lzl = lr; if(a->lzl > rr) a->lzl = rr; if(a->lzr < lr) a->lzr = lr; if(a->lzr > rr) a->lzr = rr; } Node tree[4*MN]; void upd(int node, int a, int b, int i, int j, int l, int r){ if(a > j || b < i) return; if(i <= a && b <= j){ add(tree+node, l, r); return; } push(tree+node, tree[node].lzl, tree[node].lzr); if(a != b){ add(tree+node*2, tree[node].lzl, tree[node].lzr); add(tree+node*2+1, tree[node].lzl, tree[node].lzr); } tree[node].lzl = -INF; tree[node].lzr = INF; upd(node*2, a, (a+b)/2, i, j, l, r); upd(node*2+1, 1+(a+b)/2, b, i, j, l, r); } pii ans[MN]; void fin(int node, int a, int b){ push(tree+node, tree[node].lzl, tree[node].lzr); if(a != b){ add(tree+node*2, tree[node].lzl, tree[node].lzr); add(tree+node*2+1, tree[node].lzl, tree[node].lzr); } else{ ans[a] = {tree[node].l, tree[node].r}; return; } fin(node*2, a, (a+b)/2); fin(node*2+1, 1+(a+b)/2, b); } void pr(int node, int a, int b){ cout << node << " " << a << " " << b << " " << tree[node].l << " " << tree[node].r << " " << tree[node].lzl << " " << tree[node].lzr << "\n"; if(a != b){pr(node*2, a, (a+b)/2); pr(node*2+1, 1+(a+b)/2, b);} } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){ F0R(i, k){ if(op[i] == 1){ upd(1, 1, n, left[i]+1, right[i]+1, height[i], INF); } else{ upd(1, 1, n, left[i]+1, right[i]+1, -INF, height[i]); } //pr(1, 1, n); //cout << "\n\n"; } fin(1, 1, n); F0R(i, n){ finalHeight[i] = max(0, ans[i+1].f); } } /*int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, k; cin >> n >> k; int op[k], left[k], right[k], height[k], finalHeight[n]; F0R(i, k) cin >> op[i] >> left[i] >> right[i] >> height[i]; buildWall(n, k, op, left, right, height, finalHeight); F0R(i, n) cout << finalHeight[i] << " "; cout << "\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...